10元求条DP
  • 板块学术版
  • 楼主xu_zhihao
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/14 20:59
  • 上次更新2024/10/14 22:29:50
查看原帖
10元求条DP
1063855
xu_zhihao楼主2024/10/14 20:59

昨天S模拟赛T1

求帮忙找出错误并 AC

不要说让我改思路,我想用DP练

#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){
	long long ans=1;
	while(b){
		if(b&1){
			ans*=a;
		}
		a*=a;
		b>>=1;
	}
	return ans;
}
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/14 20:59
加载中...