错误的DP方式 注意后效性
查看原帖
错误的DP方式 注意后效性
883658
tony808楼主2024/10/17 01:27
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'];
			dp[m + 1][0] = cnt;
		}
		dp[0][0] = 0;
		dp[0][1] = INF;
		dp[0][2] = INF;
		dp[0][3] = INF;
		dp[0][4] = INF;
		dp[0][5] = INF;
		dp[0][6] = INF;
		for (int o = 1; o <= leg; o++){
			for (int p = 1; p <= 6; p++)  {
				dp[o][p] = min((dp[o - 1][p] + v[n[o - 1]-'0']), (dp[o - 1][p - 1] + ccf[o - 1][p - 1] * 9 + (n[o - 1]-'0')));
				ccf[o][p] = ((dp[o - 1][p] + v[n[o - 1] - '0']) < (dp[o - 1][p - 1] + ccf[o - 1][p - 1] * 10 + (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/17 01:27
加载中...