DP 20pts 求调
查看原帖
DP 20pts 求调
883658
tony808楼主2024/10/18 00:49
import std;
using namespace std;
int main()
{

	int c=0, t=0;
	cin >> c >> t;
	for (int i = 1; i <= t; i++) {
		string n;
		cin >> n;
		int leg = n.size();
		int v[11];
		memset(v, 0, sizeof(v));
		for (int j = 1; j <= 9; j++) {
			cin >> v[j];
		}
		int dp[100007][7] = {};
		int ccf[100007][7] = {};
		int INF = 0x3fffffff;
		int cnt = 0;
		for (int m = 0; m < leg; m++) {
			cnt+= v[n[m]-'0'];
		}
		for (int m = 0; m < leg; m++) dp[m + 1][0] = cnt;
		dp[0][0] = cnt;
		dp[0][1] = cnt;
		dp[0][2] = cnt;
		dp[0][3] = cnt;
		dp[0][4] = cnt;
		dp[0][5] = cnt;
		dp[0][6] = cnt;
		for (int o = 1; o <= leg; o++){
			for (int p = 1; p <= 6; p++)  {

				dp[o][p] = min(dp[o - 1][p], dp[o - 1][p - 1] - v[n[o - 1] - '0'] + 9 * ccf[o - 1][p - 1] + (n[o - 1] - '0'));

				ccf[o][p] = (dp[o - 1][p] < (dp[o - 1][p - 1] - v[n[o - 1] - '0'] + 9 * ccf[o - 1][p - 1] + (n[o - 1] - '0'))) ? (ccf[o - 1][p]) : (ccf[o - 1][p - 1] * 10 + (n[o - 1] - '0'));
			}
		}
		int num = cnt;
		int use = 0;
		for (int q = 1; q <= 6; q++) {
			if (dp[leg][q] <= num) {
				num = dp[leg][q];
				use = q;
			}
		}
		cout << num << endl;
		cout << ccf[leg][use] << endl;
	}
	return 0;
}
2024/10/18 00:49
加载中...