HDU1423最长上升公共子序列
http://acm.hdu.edu.cn/showproblem.php?pid=1423
一维数组.
1 #include<stdio.h> 2 #include<string.h> 3 int a[510],b[510]; 4 int dp[510]; 5 int main() 6 { 7 int t,m,n,i,j; 8 scanf("%d",&t); 9 while(t--) 10 { 11 scanf("%d",&m); 12 for(i=1;i<=m;i++) 13 scanf("%d",&a[i]); 14 scanf("%d",&n); 15 for(i=1;i<=n;i++) 16 scanf("%d",&b[i]); 17 memset(dp,0,sizeof(dp)); 18 int ans=0,k; 19 dp[0]=-1; 20 for(i=1;i<=m;i++) 21 { 22 k=0; 23 for(j=1;j<=n;j++) 24 { 25 if(b[j]<a[i]&&dp[j]>dp[k]) 26 k=j; 27 if(b[j]==a[i]) 28 dp[j]=(dp[k]>=0?dp[k]:0)+1; 29 } 30 } 31 for(i=0;i<=500;i++) 32 { 33 if(ans<dp[i]) 34 ans=dp[i]; 35 } 36 printf("%d\n",ans); 37 if(t) printf("\n"); 38 } 39 return 0; 40 }
二维数组,dp[i][j]表示序列1的前i个元素和序列2的前j个序列。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N = 505; 5 int num1[N],num2[N],f[N][N]; 6 int main() 7 { 8 int t,n,m; 9 scanf("%d",&t); 10 while(t--) 11 { 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++)scanf("%d",&num1[i]); 14 scanf("%d",&m); 15 for(int j=1;j<=m;j++)scanf("%d",&num2[j]); 16 memset(f,0,sizeof(f)); 17 int answer=0; 18 int ma; 19 for(int i=1;i<=n;i++) 20 { 21 ma=0; 22 for(int j=1;j<=m;j++) 23 { 24 f[i][j]=f[i-1][j]; 25 if(num1[i]>num2[j]&&f[i-1][j]>ma)ma=f[i-1][j]; 26 if(num1[i]==num2[j])f[i][j]=ma+1; 27 } 28 } 29 for(int j=0;j<=m;j++)answer=max(answer,f[n][j]); 30 printf("%d\n",answer); 31 if(t!=0)printf("\n"); 32 } 33 return 0; 34 }