国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

【DP入門】回文字符串

2019-11-11 07:44:16
字體:
供稿:網(wǎng)友

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

描述

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

每行輸出所需添加的最少字符數(shù)

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

由此只要求父問題需要先求子問題,自下而上遞推;由于要求的子問題是1、2;2、3;3、4....n-1、n以及1、2、3;2、3、4;......n-2、n-1、n(數(shù)字代表字符串的下標(biāo))等等,即需要一個n*(n-1)/2大小的數(shù)組來存放自下而上的計算結(jié)果。本題中采用二維數(shù)組,其中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++)   //表示當(dāng)前考慮的序列長度-1			for(i = 0;i < len-gap;i++)  //表示當(dāng)前考慮的序列的起始字符下標(biāo)			{				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]);	}}動規(guī)的題目代碼量不算很大,但是個人感覺還是較為難想,還需要積累聯(lián)系。


上一篇:C#之MySql新增

下一篇:編程練習(xí)3.1

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 全州县| 昭通市| 武鸣县| 吴桥县| 明溪县| 灯塔市| 区。| 广汉市| 高淳县| 莱阳市| 阳城县| 舞阳县| 永福县| 泉州市| 常德市| 临澧县| 孟村| 永靖县| 赤壁市| 顺昌县| 乐至县| 辽宁省| 雅江县| 左云县| 方城县| 新昌县| 随州市| 五河县| 河源市| 勐海县| 获嘉县| 衡东县| 澄江县| 长沙市| 鹤岗市| 资兴市| 鹤峰县| 兖州市| 顺平县| 蓝山县| 江孜县|