Fork me on GitHub
返回顶部
跳到底部

几道动态规划题

最长连续子序列和

#include<cstdio> 
#include<algorithm>
using namespace std;

const int maxn=10010;
int A[maxn],dp[maxn];

int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&A[i]);
	}
	dp[0]=A[0];
	for(int i=1;i<n;i++){
		dp[i]=max(A[i],dp[i-1]+A[i]);
	}
	int k=0;
	for(int i=1;i<n;i++){
		if(dp[i]>dp[k]){
			k=i;
		}
	}
	printf("%d\n",dp[k]);

	return 0;
}

最长不下降子序列

#include<cstdio>
#include<algorithm>
using namespace std;

const int N=110;
int A[N],dp[N];

int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&A[i]);
	}
	int ans=-1;
	for(int i=1;i<=n;i++){
		dp[i]=1;
		for(int j=1;j<i;j++){
			if(A[i]>=A[j]&&(dp[j]+1)>dp[i]){
				dp[i]=dp[j]+1;
			}
		}
		ans=max(ans,dp[i]);
	}
	
	printf("%d",ans);
	
	return 0;
}

最长回文串

若[i,j]之间的字符串回文,则dp[i][j]=1,否则dp[i][j]=0;
先令 [i,j] 的长度L为1,即i=j,然后逐渐增大,当L大于3,如果dp[i-1][j-1]=1&&s[i]==s[j],则dp[i][j]=1;
相关问题:1040 Longest Symmetric String (25 分)

#include<iostream>
#include<string>
using namespace std;

const int maxn=1010;
int dp[maxn][maxn];

int main(){
	string s;
	getline(cin,s);
	int ans=1;
	int len=s.length();
	for(int i=0;i<len;i++){
		dp[i][i]=1;
		if(i<len-1){
			if(s[i]==s[i+1]){
				dp[i][i+1]=1;
				ans=2;
			}
		}
	}
	for(int L=3;L<=len;L++){
		for(int i=0;i+L-1<len;i++){
			int j=i+L-1;
			if(s[i]==s[j]&&dp[i+1][j-1]==1){
				dp[i][j]=1;
				ans=L;
			}
		}
	}
	printf("%d\n",ans);
	
	return 0;
}

最长公共子序列

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int N=110;
char A[N],B[N];
int dp[N][N];

int main(){
	gets(A+1);
	gets(B+1);
	int lenA=strlen(A+1);
	int lenB=strlen(B+1);
	for(int i=0;i<lenA;i++){
		dp[i][0]=0;
	}
	for(int i=0;i<lenB;i++){
		dp[0][i]=0;
	}
	for(int i=1;i<=lenA;i++){
		for(int j=1;j<=lenB;j++){
			if(A[i]==B[j]){
				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[lenA][lenB]);
	
	return 0;
}
posted @ 2018-12-04 13:11  sqmax  阅读(197)  评论(0编辑  收藏  举报