P1410 子序列
Posted feiief
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1410 子序列相关的知识,希望对你有一定的参考价值。
题解:
如果不考虑长度限制,可以用二分图染色做。
#include <bits/stdc++.h> # define LL long using namespace std; int n; int a[2001]; int col[2001]; struct Edge{ int to; int next; }e[2001*2001]; int head[2001]; int en; void add(int from, int to){ e[en].next=head[from]; e[en].to=to; head[from]=en; ++en; } bool dfs(int u, int color){ if(col[u]!=-1 && col[u]!=color) return false; if(col[u]!=-1 && col[u]==color) return true; col[u]=color; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(!dfs(v,1-color)) return false; } return true; } int main(){ while(scanf("%d", &n)!=EOF){ memset(head,-1,sizeof(head)); en=0; for(int i=1;i<=n;++i){ scanf("%d", a+i); } memset(col,-1,sizeof(col)); for(int i=1;i<=n;++i){ for(int j=i+1;j<=n;++j){ if(a[i]>=a[j]){ add(i,j); add(j,i); } } } int valid=1; for(int i=1;i<=n;++i){ if(col[i]==-1){ if(!dfs(i,0)) { valid=0; break; } } } if(valid==0) printf("No! "); else printf("Yes! "); } return 0; }
以下是dp正解:
from: https://www.luogu.com.cn/blog/user17123/solution-p1410
#include <bits/stdc++.h> # define LL long using namespace std; const int INF=0x7fffffff; int n; int a[2001]; int f[2001][2001]; int main(){ while(scanf("%d", &n)!=EOF){ for(int i=1;i<=n;++i){ scanf("%d", a+i); } for(int i=1;i<=n;++i){ for(int j=1;j<=i;++j){ f[i][j]=INF; } } f[1][1]=-1; for(int i=1;i<=n;++i){ for(int j=1;j<=i;++j){ if(f[i][j]<INF){ if(a[i+1]>a[i]){ f[i+1][j+1]=min(f[i+1][j+1],f[i][j]); } if(a[i+1]>f[i][j]){ f[i+1][i-j+1]=min(f[i+1][i-j+1],a[i]); } } } } if(f[n][n/2]==INF) printf("No! "); else printf("Yes! "); } return 0; }
以上是关于P1410 子序列的主要内容,如果未能解决你的问题,请参考以下文章