poj1458 dp
2014-11-20 19:07
330 查看
如题:http://poj.org/problem?id=1458
求最长公共升序子序列
dp[i][j]表示第一个串到i的子串和第二个子串到j的子串拥有的公共子序列的长度。
如果str1【i】=str2【j】,d[i][j]=d[i-1][j-1]+1;
否则d[i][j]=max(d[i][j-1],d[i-1][j]).
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
#define N 1001
int dp
={0};
int max(int x,int y)
{return x>y?x:y;}
int main()
{
string str1,str2;
int i,j;
while(cin>>str1>>str2)
{
memset(dp,0,sizeof(dp));
int len1=str1.length();
int len2=str2.length();
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(str1[i-1]==str2[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",dp[len1][len2]);
}
}
求最长公共升序子序列
dp[i][j]表示第一个串到i的子串和第二个子串到j的子串拥有的公共子序列的长度。
如果str1【i】=str2【j】,d[i][j]=d[i-1][j-1]+1;
否则d[i][j]=max(d[i][j-1],d[i-1][j]).
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
#define N 1001
int dp
={0};
int max(int x,int y)
{return x>y?x:y;}
int main()
{
string str1,str2;
int i,j;
while(cin>>str1>>str2)
{
memset(dp,0,sizeof(dp));
int len1=str1.length();
int len2=str2.length();
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(str1[i-1]==str2[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",dp[len1][len2]);
}
}
相关文章推荐
- 【LCS】POJ1458-Common Subsequence(模板)+LCS 的DP值算法解释
- 【LCS】POJ1458-Common Subsequence(模板)+LCS 的DP值算法解释
- poj1458 dp入门
- DP入门50题(6)——poj1458 最长公共子序列
- poj1458 Common Subsequence (dp,最长公共子序列)
- DP---(POJ1159 POJ1458 POJ1141)
- DP---(POJ1159 POJ1458 POJ1141)
- poj1458 LCS 基础dp
- ZOJ1733 POJ1458 Common Subsequence,经典DP问题
- poj1458(最长公共子序列dp)
- POJ1458 最长公共子序列 经典DP
- poj1458 Common Subsequence(经典DP)
- 动态规划入门(三)DP 基本思想 具体实现 经典题目 POJ1159 POJ1458 POJ1141
- DP+(POJ1458) 最长公共子序列
- [dp]poj1458 -Common Subsequence(LCS)
- (简单dp 水过) poj 1887 Testing the CATCHER
- NEFU English Game 字符串 dp 字典树
- poj 1083 DP
- UVALIve 4256 图的dp
- UVA1625 / UVALive 5841 Color Length DP