国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 鹤山市| 肃北| 梓潼县| 迁安市| 玉溪市| 临桂县| 壶关县| 抚州市| 江油市| 阿拉善右旗| 喜德县| 获嘉县| 四子王旗| 秦安县| 无为县| 公安县| 北流市| 洞口县| 平阳县| 扶余县| 格尔木市| 陇西县| 怀宁县| 布尔津县| 苗栗市| 桂阳县| 开鲁县| 九龙坡区| 天长市| 长宁县| 长岭县| 高密市| 腾冲县| 古交市| 衡东县| 望谟县| 垦利县| 沈阳市| 新竹市| 宁津县| 钟祥市|