首页 > 代码库 > HDU 5903 (DP)
HDU 5903 (DP)
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e3+5;int dp[maxn][maxn];char s1[maxn];char p[maxn];int main(){ int T;cin>>T; while(T--) { int n,m; scanf("%d %d",&n,&m); scanf("%s",s1); //dp[i][j],i表示当前位置,j表示当前花费是否合法。 memset(dp,0,sizeof(dp)); dp[n/2][0] = 1; for(int i=n/2;i>=0;i--) { if(s1[i]==s1[i+n/2]) { for(int j=m;j>=0;j--) { if(dp[i+1][j]) dp[i][j] = 1; //不改 } for(int j=m;j>=2;j--) { if(dp[i+1][j-2]) dp[i][j] = 1; //改两次 } } else { for(int j=m;j>=1;j--) { if(dp[i+1][j-1]) dp[i][j] = 1; //改一次 } for(int j=m;j>=2;j--) { if(dp[i+1][j-2]) dp[i][j] = 1; //改两次 } } } if(!dp[0][m]) { printf("Impossible\n"); continue; } for(int i=0;i<n/2;i++) { for(int j=0;j<26;j++) { int count1 = 0; char now = j+‘a‘; if(now!=s1[i]) count1++; if(now!=s1[i+n/2]) count1++; if(dp[i+1][m-count1]) { p[i] = j+‘a‘; p[i+n/2] = j+‘a‘; m = m-count1; break; } } } p[n] = ‘\0‘; printf("%s\n",p); } return 0;}
HDU 5903 (DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。