动态规划(二)-c++语言
一、最长公共子串问题
1.给定两串字符串,求出其最长子序列长度。
char x[100]="abcdeadk";
char y[100]="bbcdekd";
2.用dp[][];来记录最长公共子序列长度;
其中状态方程是
dp[][]={
0 i=0,j=0;
dp[i-1][j-1]+1 a[i]==b[j]
max(dp[i-1][j],dp[i][j-1]) a[i]!=b[j]//上边还是下边
}
图片解释
3.解题代码:
#include <bits/stdc++.h>
using namespace std;
int f(char* a,char* b){
int dp[100][100]={0};
int n=strlen(a);
int m=strlen(b);
//char jieguo[100]="\0";
//int cc=0;
int max=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i-1]==b[j-1]){
dp[i][j]=dp[i-1][j-1]+1;//如果相等,则左上角值加一
}
//不相等则取左边或者上边的较大值
else if(dp[i-1][j]>=dp[i][j-1]){
dp[i][j]=dp[i-1][j];
}
else{
dp[i][j]=dp[i][j-1];
}
if(max<dp[i][j]){
max=dp[i][j];
}
}
}
//cout<<jieguo;
return max;
}
int main(){
/*输入输出形式
char x[100];
char y[100];
cin>>x>>y;
*/
char x[100]="abcdeadk";
char y[100]="bbcdekd";
int k=f(x,y);
printf("%d",k);
}
二、最长非降序子序列问题
1.题目:现有给定一串数字,求出其最长非降序子序列长度;
a[9]={1,2,3,4,5,4,3,2,7};
2.状态方程:
dp[i]=max(dp[i],dp[j]+1) a[i]>=a[j],i>=j;
3.代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a[9]={1,2,3,4,5,4,3,2,7};
int dp[100]={1};
int maxe=1;
for(int i=0;i<9;i++){
for(int j=0;j<i;j++){
if(a[i]>=a[j]){
dp[i]=max(dp[i],dp[j]+1);
}
}
}
for(int k=0;k<9;k++){
maxe=max(maxe,dp[k]);
}
return maxe;
}