日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nyist oj 37 回文字符串 (动态规划经典)

發布時間:2023/11/29 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyist oj 37 回文字符串 (动态规划经典) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

回文字符串

時間限制:3000?ms ?|? 內存限制:65535?KB 難度:4 描寫敘述
所謂回文字符串,就是一個字符串。從左到右讀和從右到左讀是全然一樣的。比方"aba"。當然,我們給你的問題不會再簡單到推斷一個字符串是不是回文字符串。如今要求你,給你一個字符串,可在任何位置加入字符。最少再加入幾個字符,能夠使這個字符串成為回文字符串。 輸入
第一行給出整數N(0<N<100)
接下來的N行。每行一個字符串,每一個字符串長度不超過1000.
輸出
每行輸出所需加入的最少字符數
例子輸入
1 Ab3bd
例子輸出
2
來源

IOI 2000

開始看到這道題的時候,一時想不出用什么非常好的方法來做。看到分類是在動態規劃,也大致往這方面想??戳藙e人的思路。頓時茅塞頓開啊,直接把給定的字符串倒轉,然后再和原字符串一起,求他們的最長公共序列,然后再拿字符串的長度減去他們的最長公共序列的長度,得到的就是要加入的最小的字符數。想到了這個地方,這個題目就非常好解啦;直接用LIC水過,狀態方程式也和前面做過的題一樣;

#include <cstdio> #include <cstring> #define max(a,b) a>b?a:b const int maxn=1001; char a[maxn],b[maxn]; int dp[maxn][maxn];//昨天晚上把DP的類型設置成了char型,然后提交一直wa,刷屏了。。

。不應該啊!。 int main() { int n,i,j,len; scanf("%d",&n); while(n--) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); scanf("%s",a); len=strlen(a); for(i=len-1,j=0;i>=0;i--) b[j++]=a[i]; for(i=1;i<=len;i++) { for(j=1;j<=len;j++) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;//遞推關系 else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",len-dp[len][len]); } }

看到別人的寫的,用了還有一種思路,也是動態規劃??墒沁f推關系有一點不同;有點沒看懂;

省去了倒轉的環節

#include<stdio.h> #include<string.h> int f[1005][1005]; int main() { int n; scanf("%d",&n); while (n--) { char s[1005]; scanf("%s",s); int k,i,j,l=strlen(s); for (i=0;i<l;++i) f[i][i]=0; for (k=2;k<=l;++k) { for (i=0;i<=l-k;++i) { int p=i+k-1; if (s[i]==s[p]) { f[i][p]=f[i+1][p-1]; } else { f[i][p]=1+(f[i][p-1]<f[i+1][p]?

f[i][p-1]:f[i+1][p]); } } } printf("%d\n",f[0][l-1]); memset(f,0,sizeof(f)); } return 0; }


看到別人的最優代碼,內存占用的非常小。值得學習,另一種滾動數組。好像能夠節約內存。還沒有接觸過;

#include<stdio.h> #include<string.h> using namespace std; int m[1000],i,j,t1,t2,len; char s[1001]; int main() {int N;scanf("%d",&N);while(N--){scanf("%s",s);len=strlen(s);for(i=len-1;i>=0;i--){m[i]=0;t1=m[i];for(j=i+1;j<len;j++){t2=m[j];if(s[i]==s[j])m[j]=t1;elsem[j]=m[j-1]<m[j]?m[j-1]+1:m[j]+1;t1=t2;}}printf("%d\n",m[len-1]);} }


轉載于:https://www.cnblogs.com/wzjhoutai/p/7222299.html

總結

以上是生活随笔為你收集整理的nyist oj 37 回文字符串 (动态规划经典)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。