T1 DP 0pts?(2关
  • 板块学术版
  • 楼主xu_zhihao
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/10/13 18:33
  • 上次更新2024/10/13 20:04:31
查看原帖
T1 DP 0pts?(2关
1063855
xu_zhihao楼主2024/10/13 18:33

求条

#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=1;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=min(n-i+1,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=2;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);
				//printf("dp[%d][%d][%d]=%lld,dp[%d][%d][%d]=%lld ",i,0,k,dp[i][0][k],i,1,k,dp[i][1][k]);
			}
			//printf("\n");
		}
		long long ans=INF;
		for(int j=0;j<=1;j++){
			//int mx=min(n,5);
			for(int k=0;k<=6;k++){
				ans=min(ans,dp[1][j][k]);
			}
		}
		printf("%lld\n",ans);
	}
	return 0; 
}
2024/10/13 18:33
加载中...