几道动态规划题
最长连续子序列和
#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;
}