神奇的WA 2~9
查看原帖
神奇的WA 2~9
1014614
SWAP__楼主2024/10/13 19:16

普通dp,f[i]表示删掉了i个数

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;
const int M = 501;
int n, v[10], a[N], f[N], r[11], ans[11];
char s[N];
inline void read() {
	cin >> s;
	//scanf("%s", &);
	int x = 0;
	n = strlen(s);
	for(int i = 1; i <= n; i++) {
		a[i] = s[i - 1] - '0';
		if(i <= 10){
			ans[i] = ans[i - 1] * 10 + a[i];
		}
	}
}
signed main() {
//	if(system("fc bargain.out bargain1.ans")){
//		
//	}
//	freopen("bargain2.in", "r", stdin);
//	freopen("bargain.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	int x = 1;
	for(int i = 1; i <= 10; i++){
		r[i] = x;
		x *= 10;
	}
	int c, t;
	cin >> c >> t;
	while(t--){
		read();
		int k = 0;
		for(int i = 1; i <= 9; i++){
			cin >> v[i];
		}
		for(int i = 1; i <= n; i++){
			k += v[a[i]];
			f[i] = 0x7ffffffffffff;
		}
	//	cout << ans[16] << "s";
		int minn = k;
		f[0] = 0;
	//	int ans = 0;
		for(int i = 1; i <= n; i++){
			f[i] = f[i - 1] + v[a[i]];
			if(i == n){
				minn = min(minn, f[i]);
			}
			for(int j = i - 1; j >= 1; j--){
				if(i - j > 6){
					f[j] = f[j - 1] + v[a[i]];//单独删
					f[j - 1] = 0x7ffffffffffff;
					if(i == n){
						minn = min(minn, f[j]);	
					}
					break;
				}else{
					f[j] = f[j] + r[i - j] * a[i];
					f[j] = min(f[j], f[j - 1] + v[a[i]]);
				}
				if(i == n){
					minn = min(minn, f[j]);
				}
			//	cout << i << " " << j << " " << f[j] << endl;
			}
			if(i <= 6){
			//	ans = ans * 10 + r[i] * a[i];
				f[0] = ans[i];
			}else{
				f[0] = 0x7ffffffffffff;
			}
			if(i == n){
				minn = min(minn, f[0]);
			}
			
		}
//		for(int j = 0; j <= n; j++){
//			cout << n << " " << j << " " << f[j] << endl;
//		}
		cout << minn << endl;
	}
}
2024/10/13 19:16
加载中...