点击打开链接链接
3 2 1 1 4 1 2 3 4 5 1 1 2 2 2
1 3 2HintFor the first sequence, there are two increasing subsequence: [1], [1]. So the length of the second longest increasing subsequence is also 1, same with the length of LIS.
普通lcs再sort是不对的
反例 :
1 1 2
方法一:
统计到每个长度的个数
#include<cstdio> #include<cstring> int max(int a,int b) { return a>b?a:b; } long long cnt[1111]; int a[1111],dp[1111]; int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) cnt[i]=1; int ans=0; long long num=0; for(int i=1;i<=n;i++) { cnt[i]=1; dp[i]=1; for(int j=1;j<i;j++) { if(a[j]<a[i]) { if(dp[i]<dp[j]+1) { dp[i]=dp[j]+1; cnt[i]=cnt[j]; } else if(dp[i]==dp[j]+1) cnt[i]+=cnt[j]; } } ans=max(ans,dp[i]); } for(int i=1;i<=n;i++) { if(dp[i]==ans) num+=cnt[i]; } if(num==1) printf("%d\n",ans-1); else if(num>1) printf("%d\n",ans); } return 0; }
求lcs的第K优解 开二维的dp
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[1111][3]; int a[1111]; int ans[2222]; int main() { int t,n; int s[10]; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); int xx=0; for(int i=1;i<=n;i++) { dp[i][0]=1; dp[i][1]=0; for(int j=1;j<i;j++) { if(a[j]<a[i]) { s[0]=dp[j][0]+1; s[1]=dp[j][1]+1; s[2]=dp[i][0]; s[3]=dp[i][1]; sort(s,s+4); dp[i][0]=s[3]; dp[i][1]=s[2]; } } ans[xx++]=dp[i][0]; ans[xx++]=dp[i][1]; } sort(ans,ans+2*n); printf("%d\n",ans[xx-2]); } return 0; }
hdu 5087 Revenge of LIS II lcs变形
原文地址:http://blog.csdn.net/qq_16843991/article/details/40865639