[BZOJ1786&&BZOJ1831]配对 dp
来源:互联网 发布:海意it 编辑:程序博客网 时间:2024/05/30 02:53
首先我们可以发现所有-1的地方单调不降的填是会比正着填更优的。证明的话应该是反正吧。考虑???A????B??,(?全是确定的数),首先A和B的顺序在A左边和B右边并不会增加逆序对数,中间的数如果< A或 >B都会产生1的贡献,倘若A>B,< A和 >B的贡献个数是大于等于> A和< B的贡献个数的,再加上A,B本身产生的一个逆序对,还不如反过来填成A< B。
所以接下来就是DP了,f[i,j]表示第i个-1的位置,填j的最少逆序对增量,那么f[i,j]=min{f[i-1,k]}(1<=k<=j)+large[place[i],j]+little[place[i],j]。place表示-1的位置,large[i,j]表示第i个数是j的时候前面有多少个大于它的,little则表示后面小于的。large,little可以预处理,min可以在dp过程中更新。
复杂度:O(nk)。
代码:
var n,k,i,j,num,ans:longint; a,pl,c:array[0..10010]of longint; f,lar,lit,min:array[0..10010,0..110]of longint;const maxl=1000000000;function qmin(x,y:longint):longint;begin if x>y then exit(y) else exit(x);end;begin readln(n,k); num:=0; for i:=1 to n do begin read(a[i]); if a[i]=-1 then begin inc(num); pl[num]:=i; end; end; for i:=2 to n do for j:=1 to k do begin lar[i,j]:=lar[i-1,j]; if (a[i-1]>j)and(a[i-1]<>-1) then inc(lar[i,j]); end; for i:=n-1 downto 1 do for j:=1 to k do begin lit[i,j]:=lit[i+1,j]; if (a[i+1]<j)and(a[i+1]<>-1) then inc(lit[i,j]); end; for i:=1 to num do min[i,0]:=maxl; for i:=1 to num do for j:=1 to k do begin f[i,j]:=min[i-1,j]+lit[pl[i],j]+lar[pl[i],j]; min[i,j]:=qmin(f[i,j],min[i,j-1]); end; ans:=maxl; for i:=1 to k do ans:=qmin(ans,f[num,i]); for i:=1 to n do if a[i]<>-1 then ans:=ans+lar[i,a[i]]; writeln(ans);end.
0 0
- [BZOJ1786&&BZOJ1831]配对 dp
- BZOJ1786: [Ahoi2008]Pair 配对
- bzoj1786: [Ahoi2008]Pair 配对
- bzoj1786&1831[Ahoi2008]Pair 配对
- bzoj1786
- bzoj1831: [AHOI2008]逆序对 DP
- [DP] BZOJ1831: [AHOI2008]逆序对
- bzoj1831 [AHOI2008]逆序对(dp)
- BZOJ1831
- bzoj1831
- 【bzoj1831/1786】【AHOI2008】【逆序对】【dp】
- 【bzoj1237】【scoi2008】【配对】【dp】
- BZOJ1237 配对 [DP]
- bzoj1237 wikioi2430 [SCOI2008]配对 dp
- 【bzoj 1237】[SCOI2008]配对 dp
- [BZOJ1237][SCOI2008]配对(dp)
- poj 1141 DP 括号配对
- 状态压缩dp 最优配对问题
- MySQL
- 二,Eclipse的egit插件冲突合并方法
- nginx的部署学习
- unity—NGUI播放视频及声音注意事项
- poj 3345 树形dp
- [BZOJ1786&&BZOJ1831]配对 dp
- 一个高性能RPC框架原理剖析
- 一个高性能RPC框架的连接管理
- 零基础掌握极大似然估计
- C语言字符串处理函数的实现
- zkw费用流
- POJ 2479(动态规划)
- sscanf 函数引起的段错误
- 观察者模式