#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 分)ios
#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; }