麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

【DP入門】回文字符串

2019-11-11 06:55:26
字體:
來源:轉載
供稿:網友

題目來自nyist第37題,如下:

描述

所謂回文字符串,就是一個字符串,從左到右讀和從右到左讀是完全一樣的,比如"aba"。當然,我們給你的問題不會再簡單到判斷一個字符串是不是回文字符串。現在要求你,給你一個字符串,可在任意位置添加字符,最少再添加幾個字符,可以使這個字符串成為回文字符串。輸入第一行給出整數N(0<N<100)接下來的N行,每行一個字符串,每個字符串長度不超過1000.輸出

每行輸出所需添加的最少字符數

DP解法,先找遞推式,要求ai,ai+1,ai+2....aj序列的解,有兩種情況,第一是ai == aj,則轉換為求ai+1,ai+2 ... aj-1序列的解;第二是ai != aj,此時可能的最小解是在左邊添上一個aj-1,這樣便轉換為第一種情況,或者在右邊添上一個ai+1,也轉換為第一種情況,而最終父問題的解就取自直接子問題以及第二種情況中兩個子問題中的最小解。

由此只要求父問題需要先求子問題,自下而上遞推;由于要求的子問題是1、2;2、3;3、4....n-1、n以及1、2、3;2、3、4;......n-2、n-1、n(數字代表字符串的下標)等等,即需要一個n*(n-1)/2大小的數組來存放自下而上的計算結果。本題中采用二維數組,其中dp[i][j]表示從第i個字符到第j個字符所組成的序列的解。

代碼如下:

#include <stdio.h>#include <string.h>#include <stdlib.h>int dp[1000][1000+2];int main(){	int N,i,j,gap,len;	char s[1000+5];	scanf("%d",&N);	while(N--)	{		memset(dp,0,sizeof(dp));		scanf("%s",s);		len = strlen(s);		for(i = 0;i < len;i++)	dp[i][i] = dp[i][i-1] = 0;		for(gap = 1;gap < len;gap++)   //表示當前考慮的序列長度-1			for(i = 0;i < len-gap;i++)  //表示當前考慮的序列的起始字符下標			{				j = i + gap; //end 				dp[i][j] = 1000;//任意的大值即可				if(s[i] == s[j]) dp[i][j] = dp[i+1][j-1];				dp[i][j] = dp[i][j] > (dp[i+1][j]+1) ? (dp[i+1][j]+1) : dp[i][j];				dp[i][j] = dp[i][j] > (dp[i][j-1]+1) ? (dp[i][j-1]+1) : dp[i][j];			}		PRintf("%d/n",dp[0][len-1]);	}}動規的題目代碼量不算很大,但是個人感覺還是較為難想,還需要積累聯系。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美在线观看禁18 | 欧美 亚洲 激情 | 日韩黄色影视 | 久久久久久久一区二区三区 | 草莓视频在线导航 | 91天堂国产在线 | av在线直播观看 | 国产精品午夜未成人免费观看 | 成人精品视频在线 | 免费中文视频 | 久久久久电影网站 | 色七七亚洲 | 成人三级视频网站 | 91精品国产综合久久婷婷香蕉 | 色人久久 | 久久国产精品影视 | av免费在线观看国产 | 国产精品久久久久网站 | av成人一区二区 | 久久污| 看免费5xxaaa毛片 | 成人国产精品久久久 | 精品视频在线免费看 | 国产流白浆高潮在线观看 | 噜噜在线视频 | 美女久久久久 | 久久精品中文字幕一区二区三区 | 精品一区二区三区免费看 | 日韩欧美色综合 | 亚洲电影在线观看高清免费 | 精品国产乱码一区二区三区四区 | 免费观看9x视频网站在线观看 | 久久精品一区二区三区国产主播 | 国产亚洲高清在线精品不卡 | 九九精品久久 | 欧美性videofree精品 | 久久亚洲美女视频 | 成人免费自拍视频 | 日韩视频观看 | 午色影院 | 欧美一级片在线 |