首页 > 代码库 > 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)