wa0pts求条(2关
查看原帖
wa0pts求条(2关
1063855
xu_zhihao楼主2024/10/13 20:18
#include<bits/stdc++.h>
using namespace std;
long long dp[100010][2][7];//枚举到第i位使用操作j且前i个位置用了k个操作2 
long long INF=1e18;
long long a[100010];
char s[100010];
int n;
void Init(){
	for(int i=0;i<=n;i++){
		for(int j=0;j<=1;j++){
			for(int k=0;k<=6;k++){
				dp[i][j][k]=INF;
			}
		} 
	}
	return;
}
long long Pow(long long a,long long b){
	if(!b){
		return 1;
	}
	else if(b==1){
		return a;
	}
	else if(b==2){
		return a*a;
	}
	else if(b==3){
		return a*a*a;
	}
	else if(b==4){
		return a*a*a*a;
	}
	else if(b==5){
		return a*a*a*a*a;
	}
	else{
		return a*a*a*a*a*a;
	}
}
int main(){
	freopen("bargain2.in","r",stdin);
	int c;
	scanf("%d",&c);
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%s",s+1);
		n=strlen(s+1);
		Init();
		for(int i=1;i<=9;i++){
			scanf("%lld",&a[i]);
		}
		for(int i=n;i>=1;i--){
			int mx=6;
			dp[i][0][0]=dp[i+1][0][0]+a[s[i]-'0'];
			for(int k=1;k<=mx;k++){
				dp[i][0][k]=min(dp[i+1][0][k],dp[i+1][1][k])+a[s[i]-'0'];
			}
			//dp[i][1][1]=dp[i+1][0][0]+1ll*(s[i]-'0')*Pow(10,0);
			for(int k=1;k<=mx;k++){
				dp[i][1][k]=min(dp[i+1][0][k-1],dp[i+1][1][k-1])+1ll*(s[i]-'0')*Pow(10,k-1);
			}
		}
		long long ans=INF;
		for(int j=0;j<=1;j++){
			for(int k=0;k<=6;k++){
				ans=min(ans,dp[1][j][k]);
			}
		}
		printf("%lld\n",ans);
	}
	return 0; 
}
2024/10/13 20:18
加载中...