最長上升子序列相關問題筆記
阿新 • • 發佈:2021-07-17
//求最長上升子序列長度 cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) if(a[j]>a[i]) f[j]=max(f[j],f[i]+1); } //求最長上升子序列長度和方案 //f[i]表示以i個位置結尾的最長長度 //g[i]代表f[i]這個狀態是由哪個狀態轉移過來的 void dfs(int p) { if(p==0)return ; dfs(g[p];) cout<<p<<endl; } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) if(a[j]>a[i]) if(f[i]+1>f[j]) { f[j]=f[i]+1; g[j]=i; } } int p=1; for(int i=2;i<=n;i++) if(f[i]>f[p]) p=i; dfs(p); return 0; } //求最長上升子序列的數量 void dfs(int p) { if(p==0)return ; dfs(g[p];) cout<<p<<endl; } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; memset(f,0,sizeof(f)); memset(h,0,sizeof(h)); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) if(a[j]>a[i]) if(f[i]+1>f[j]) { f[j]=f[i]+1; g[j]=i; h[j]=h[i]; } else if(f[i]+1==f[j])h[j]+=h[i]; } int p=1; for(int i=2;i<=n;i++) if(f[i]>f[p]) p=i; dfs(p); return 0; }