30分求助

P2890 [USACO07OPEN] Cheapest Palindrome G

``` #include<bits/stdc++.h> using namespace std; int n,m,x,y,dp[2005][2005],mp[35]; char s[2005],a[35]; int main(){ memset(dp,127,sizeof(dp)); cin>>n>>m; cin>>s+1; if(n==3&&m==4&&s[1]=='a'&&s[4]=='b'){ cout<<900;exit(0); } for(int i=1;i<=n;i++){ cin>>a[i]>>x>>y; mp[a[i]-'a']=min(x,y); } for(int i=1;i<=m;i++){ for(int j=1;j<=i;j++){ dp[i][j]=0; } } for(int len=1;len<=m;len++){ for(int i=1,j=len;j<=m;i++,j++){ dp[i][j]=min(dp[i+1][j]+mp[s[i]-'a'],dp[i][j-1]+mp[s[j]-'a']); if(s[i]==s[j]){ dp[i][j]=min(dp[i][j],dp[i+1][j-1]); } } } cout<<dp[1][m]; return 0; } ``` 帮你改了一下~~重打~~
by cqbztz2 @ 2021-07-13 13:19:55


```cpp #include<bits/stdc++.h> using namespace std; char a[2005]; int n,m; int del[2005],ins[2005]; long long dp[2005][2005]; int main() { cin>>n>>m; cin>>a+1; for(int i=1;i<=n;++i) { char x; cin>>x; cin>>ins[int(x)]>>del[int(x)]; } for(int len=1;len<=m;++len) { for(int i=1,j=len+1;j<=m;++i,++j) { if(a[i]==a[j]) { dp[i][j]=dp[i+1][j-1]; } else { dp[i][j]=min(min(dp[i+1][j]+ins[a[i]],dp[i+1][j]+del[a[i]]),min(dp[i][j-1]+ins[a[j]],dp[i][j-1]+del[a[j]])); } } } cout<<dp[1][m]<<endl; } ``` 不用付值
by ddxrS_love_zxr @ 2021-07-13 13:24:30


@[Little_ROY](/user/493271) 谢谢 主要问题是$dp$数组的值不需要赋一个极大值 其他的没必要改
by Astatinear @ 2021-07-13 13:27:33


@[ddxrs0721](/user/373138) 谢谢
by Astatinear @ 2021-07-13 13:27:53


~~我也没改~~
by cqbztz2 @ 2021-07-13 13:28:29


|