1. 程式人生 > >南陽理工學院動態規劃專題 迴文字串

南陽理工學院動態規劃專題 迴文字串

這個問題使用動態規劃求解,dp[i][j]表示字串下標為i的字元和下標為j的字元區間內構成迴文所需加入的最少的字串。

當str[i]==str[j]時,則dp[i][j]=dp[i+1][j-1],當str[i]!=str[j]時,dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1),初始化時候,d[i][i]=0,d[i][i+1]=1(這裡真是糾結了一個多小時,我還以為我轉移方程錯了!!!)。輸出dp[0][strlen(str)-1].

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[1001];
int dp[1001][1001];
int main()
{
   int cas;
   cin>>cas;
   while(cas--)
   {
       cin>>str;
       int l=strlen(str);
       for(int i=0;i<l;i++)
       {
           dp[i][i]=0;
       }
       for(int i=0;i<l-1;i++)
       {
           if(str[i]==str[i+1])
             dp[i][i+1]=0;
           else dp[i][i+1]=1;
       }
       for(int k=2;k<l;k++)
       {
           for(int i=0;i+k<l;i++)
           {
               int j=i+k;
               if(str[i]==str[j])
               {
                   dp[i][j]=dp[i+1][j-1];
               }
               else
               {
                   dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
               }
           }
       }
//       for(int i=0;i<l;i++)
//       {
//         for(int j=0;j<l;j++)
//            cout<<dp[i][j]<<' ';
//         cout<<endl;
//       }

       cout<<dp[0][l-1]<<endl;
   }
}

迴文字串

時間限制:3000 ms  |            記憶體限制:65535 KB 難度:4
描述
所謂迴文字串,就是一個字串,從左到右讀和從右到左讀是完全一樣的,比如"aba"。當然,我們給你的問題不會再簡單到判斷一個字串是不是迴文字串。現在要求你,給你一個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為迴文字串。
輸入
第一行給出整數N(0<N<100)
接下來的N行,每行一個字串,每個字串長度不超過1000.
輸出
每行輸出所需新增的最少字元數
樣例輸入
1
Ab3bd
樣例輸出
2
來源
上傳者