最長公共子序列&迴文字串 nyoj動態規劃

一名路過的小碼農啊發表於2017-03-21
最長公共子序列
時間限制:3000 ms  |  記憶體限制:65535 KB
難度:3
描述
我們們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。
tip:最長公共子序列也稱作最長公共子串(不要求連續),英文縮寫為LCS(Longest Common Subsequence)。其定義是,一個序列 S ,如果分別是兩個或多個已知序列的子序列,且是所有符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。
輸入
第一行給出一個整數N(0<N<100)表示待測資料組數
接下來每組資料兩行,分別為待測的兩組字串。每個字串長度不大於1000.
輸出
每組測試資料輸出一個整數,表示最長公共子序列長度。每組結果佔一行。
樣例輸入
2
asdf
adfsd
123abc
abc123abc
樣例輸出
3
6

迴文字串

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

#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
char x[1004],y[1004];
int dp[1004][1004];
int main()
{
	int ca;
	scanf("%d",&ca);
	while(ca--)
	{
		scanf("%s",x);
		scanf("%s",y);
		int len1=strlen(x);int len2=strlen(y);
		for(int i=0;i<len1;i++)
		{
			for(int j=0;j<len2;j++)
			{
				if(x[i]==y[j])dp[i+1][j+1]=dp[i][j]+1;
				else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
			}
		} 
		printf("%d\n",dp[len1][len2]);
	}
	return 0;
}

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstring> 
#include<algorithm>
using namespace std;
int dp[1006][1006];
char s[1006];
char d[1006];
int main()
{
	int ca;
	scanf("%d",&ca);
	getchar();
	while(ca--)
	{
		gets(s);
		int len1=strlen(s);
		int x=0;
		for(int i=len1-1;i>=0;i--)
		{
			d[x++]=s[i];
		}
		for(int i=0;i<len1;i++)
		{
			for(int j=0;j<len1;j++)
			{
				if(d[j]==s[i])dp[i+1][j+1]=dp[i][j]+1;
				else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
			}
		}
		printf("%d\n",len1-dp[len1][len1]);
	}
	return 0;
}

相關文章