电视直播网站开发,软件开发中,凡科网站建设怎么去掉极速建站,天津网站建设排名正题 题目大意
求最长不下降子序列和可以取出多少以及允许多次使用一些数时可以取出多少个。 解题思路
第一问dp求#xff0c;且保存以xxx开头的最长长度fxf_xfx。 第二问考虑网络流。 我们对于每个数字以fif_ifi的不同分层#xff0c;然后每次从下往上一层连接#x…正题 题目大意
求最长不下降子序列和可以取出多少以及允许多次使用一些数时可以取出多少个。 解题思路
第一问dp求且保存以xxx开头的最长长度fxf_xfx。 第二问考虑网络流。 我们对于每个数字以fif_ifi的不同分层然后每次从下往上一层连接然后对于每个点拆开以限制每个点的流量保证每个点只取一次就好了。 第三问在第二问的基础上将点1和点n的流量限制去掉就好了。 code
#includecstdio
#includealgorithm
#includeiostream
#includecstring
#includequeue
using namespace std;
struct line{int to,next,c;
}a[200001];
queueintf;
int n,d[1001],s,e,num[1001],l,tot,ls[1001],ans;
int ff[1001];
void addl(int x,int y,int z)
{a[tot].toy;a[tot].nextls[x];a[tot].cz;ls[x]tot;a[tot].tox;a[tot].nextls[y];ls[y]tot;
}
bool bfs()
{memset(d,0,sizeof(d));d[s]1;f.push(s);while (!f.empty()){int xf.front();for (int ils[x];i0;ia[i].next){int ya[i].to;if (a[i].c0 d[y]0){d[y]d[x]1;f.push(y);}}f.pop();}if (d[e]) return true;else return false;
}
int dinic(int x,int flow)
{int rest0,k;if (xe) return flow;for (int ils[x];i0;ia[i].next){int ya[i].to;if (a[i].c0d[y]d[x]1flowrest){rest(k(dinic(y,min(flow-rest,a[i].c))));a[i].c-k;a[i^1].ck;}}if (!rest) d[x]0;return rest;
}
int main()
{tot-1;memset(ls,-1,sizeof(ls));scanf(%d,n);s0;e2*n1;for (int i1;in;i)scanf(%d,num[i]);for (int in;i1;i--){ff[i]max(ff[i],1);for (int ji1;jn;j)if (num[i]num[j]){ff[i]max(ff[i],ff[j]1);}lmax(l,ff[i]);}printf(%d\n,l);if (l1){printf(%d\n%d,n,n);return 0;}for (int i1;in;i){addl(2*i-1,2*i,1);if (ff[i]l)addl(s,2*i-1,1);if (ff[i]1)addl(2*i,e,1);}for (int i1;in;i)for (int ji1;jn;j)if (num[i]num[j]ff[i]ff[j]1) addl(2*i,2*j-1,1);while (bfs()) ansdinic(s,1e9);printf(%d\n,ans);if (ff[1]l)addl(1,2,1e9),addl(s,1,1e9);addl(2*n-1,2*n,1e9);addl(2*n,e,1e9);//ans0;while (bfs()) ansdinic(s,1e9);printf(%d,ans);
}