先从简单一点的bzoj2431入手;

n个数1~n已经限定了,所以

对于1~i-1,新加入i,最多可以增加i-1个逆序对,最少增加0个逆序对

f[i,j]表示1~i形成的序列逆序对为j的方案数

比较容易得出f[i,j]=Σf[i-1,k];

用前缀和优化即可

 const mo=;
var f:array[..,..] of longint;
    s:array[..] of longint;
    i,j,k,n,m,p:longint; begin
  readln(n,m);
  k:=;
  f[,]:=;
  for i:= to n do
  begin
    k:=-k;
    s[]:=f[-k,] mod mo;
    for j:= to m do
    begin
      s[j]:=(s[j-]+f[-k,j]) mod mo;
      f[k,j]:=;
    end;
    for j:= to m do
    begin
      p:=j-i+;
      if p< then p:=;
      f[k,j]:=(s[j]-s[p]+f[-k,p]) mod mo;
    end;
  end;
  if f[k,m]< then f[k,m]:=f[k,m]+mo;
  writeln(f[k,m] mod mo);
end.

bzoj2431

然后是bzoj1831

首先我们可以先求出固定的逆序对;

然后根据贪心的思想,不难得出需要填的数是不下降的

具体证明见:http://www.cnblogs.com/htfy/archive/2012/12/11/2813497.html

令big[i,j]表示第i为数字为j时,前面有多少个比它大的

small[i,j]表示第i为数字为j时,前面有多少个比它小的

f[i,j]表示第i个-1填j最小逆序对数目

得:f[i,j]=min(f[i-1,k])+small[loc[i],j]+big[loc[i],j];

我曾经讲过对于这样的dp怎么优化,具体见程序

 var c,a,b:array[..] of longint;
    f,small,big:array[..,..] of longint;
    t,n,m,i,j,ans,s:longint; function lowbit(x:longint):longint;
  begin
    exit(x and (-x));
  end; function ask(x:longint):longint;
  begin
    ask:=;
    while x> do
    begin
      ask:=ask+c[x];
      x:=x-lowbit(x);
    end;
  end; procedure add(x:longint);
  begin
    while x<=m do
    begin
      inc(c[x]);
      x:=x+lowbit(x);
    end;
  end; begin
  readln(n,m);
  for i:= to n do
  begin
    read(a[i]);
    if a[i]=- then
    begin
      inc(t);
      b[t]:=i;
    end;
  end;
  for i:=n downto do
  begin
    if a[i]<>- then
    begin
      add(a[i]);
      s:=s+ask(a[i]-);
    end
    else begin
      for j:= to m do
        small[i,j]:=ask(j-);
    end;
  end;
  fillchar(c,sizeof(c),);
  for i:= to n do
  begin
    if a[i]<>- then add(a[i])
    else begin
      for j:= to m do
        big[i,j]:=ask(m)-ask(j);
    end;
  end;
  for i:= to t do
  begin
    f[i,]:=f[i-,];
    for j:= to m do
      f[i,j]:=min(f[i-,j],f[i,j-]);   //优化
    for j:= to m do
      f[i,j]:=f[i,j]+big[b[i],j]+small[b[i],j];
  end;
  ans:=;
  for i:= to m do
    ans:=min(ans,f[t,i]);
  writeln(ans+s);
end.

bzoj1831

总体来说,这两题不算太难,但我还是花了很多时间

  1. 是做题不够认真,戒之戒之

  2. 自己想出的零散的特点性质没有很好的整合,导致题目做不出来

逆序对的相关问题:bzoj1831,bzoj2431的更多相关文章

  1. [BZOJ1786][BZOJ1831]逆序对

    [BZOJ1786][BZOJ1831]逆序对 试题描述 输入 输出 输入示例 - - 输出示例 数据规模及约定 见“输入” 题解 首先这题有一个性质,即,填的数从左到右一定不降.证明不妨读者自己yy ...

  2. 【BZOJ2431】逆序对数列(动态规划)

    [BZOJ2431]逆序对数列(动态规划) 题面 Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组 ...

  3. 【BZOJ1831】[AHOI2008]逆序对(动态规划)

    [BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\) ...

  4. BZOJ2431 HAOI2009 逆序对数列 【DP】*

    BZOJ2431 HAOI2009 逆序对数列 Description 对于一个数列ai{a_i}ai​,如果有i<j且ai>aja_i>a_jai​>aj​,那么我们称aia ...

  5. bzoj2431: [HAOI2009]逆序对数列

    dp. f[i][j]表示放置第i个数有j个逆序对的方案数. s[i][j]维护前缀和(f[i][0]~f[i][j]). 状态转移方程 f[i][j]=s[i-1][j]-s[i-1][max(j- ...

  6. bzoj2431:[HAOI2009]逆序对数列

    单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...

  7. BZOJ1831: [AHOI2008]逆序对

    1831: [AHOI2008]逆序对 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 341  Solved: 226[Submit][Status] ...

  8. 【BZOJ2431】【HAOI2009】逆序对数列 DP

    题目大意 问你有多少个由\(n\)个数组成的,逆序对个数为\(k\)的排列. \(n,k\leq 1000\) 题解 我们考虑从小到大插入这\(n\)个数. 设当前插入了\(i\)个数,插入下一个数可 ...

  9. bzoj1831 逆序对 (dp+树状数组)

    注意到,所有的-1应该是一个不降的序列,否则不会更优那就先求出来不是-1的的逆序对个数,然后设f[i][j]表示第i个-1放成j的前i个-1带来的最小逆序对数量这个可以树状数组来求 #include& ...

随机推荐

  1. 处理部分WordPress核心代码或功能,让你的网站更快

    处理部分WordPress核心代码或功能,让你的网站更快 http://www.wpdaxue.com/speed-up-wordpress.html

  2. 购买 CDRTools 2 正式版

    联系方式: Email:396390927@qq.com QQ: 396390927    QQ群: 26326434  组件价格: ¥50元/用户,免费更新: 此物为数字商品,并经过测试完全可用,谢 ...

  3. Python学习_数据排序方法

    Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2, ...

  4. python编程语言缩进格式

    python的缩进格式是python语法中最特别的一点,很多已经习惯了其他语言的朋友再去学python的话,开始会觉的不太 习惯. 怎么看怎么都觉的别扭,也有一些朋友因为这个特别的格式与python失 ...

  5. 使用公钥登录SSL

    在本地生成密钥对 ssh-keygen -t rsa 如果不想设置密码,可以直接点击回车. 如果你想使用DSA可以用-t DSA替换. 确保远程计算机上用户目录下有.ssh目录 确保你的连接服务器上的 ...

  6. (转)《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  7. 另一个 SqlParameterCollection 中已包含 SqlParameter

    出处:http://www.cnblogs.com/OldYongs/archive/2011/03/12/1982021.html#2742742 一般情况下,我们定义的一个SqlParameter ...

  8. 【IOS】分享下近一年IOS开发的经验总结

    从上个暑假末到现在,自己做IOS开发也快一年了.从一开始的什么都不知道,到现在大多事都能搭上一两手,期间经历了很多事情.下面来和大家分享一下心得和感触. 1.现在移动领域的知识更新的很快,无论是IOS ...

  9. HttpClient抓取网页内容简单介绍

    版本HttpClient3.1 1.GET方式 第一步.创建一个客户端,类似于你用浏览器打开一个网页 HttpClient httpClient = new HttpClient(); 第二步.创建一 ...

  10. 使用eclipse生成文档(javadoc)

    使用eclipse生成文档(javadoc)主要有三种方法:1,在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步.在Java ...