BZOJ1786 [Ahoi2008]Pair 配对 动态规划 逆序对

时间:2022-03-10 07:07:12

欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1786


题意概括

  给出长度为n的数列,只会出现1~k这些正整数。现在有些数写成了-1,这些-1可以变成任何数。

  求把这些-1变成1~k中的正整数之后,最少的逆序对个数为多少。


题解

  我们可以判断,这些-1中写的数字一定是单调不降的。

  为什么?我们把答案序列的所有-1位抽出来,如果答案序列中有一组是逆序的,那么交换他们,一定可以保证小的那个换到大的那个的位置的时候,它左右产生的逆序对数一定比大的原先不多,同理,大的在原先的小的的位置上,产生的逆序对数也比原来小的不多。交换他们,本身就会减少一个逆序对,那么一定是更优的。

  所以我们确定了一定是单调不降的。

  那么这些-1位之间也不会有逆序对。

  那么就是一个简单的dp了。

  设dp[i][j]表示前i位,填到了j这个数,最少的逆序对数。注意这里的逆序对数是指-1中的数添入之后产生的逆序对数。

  然后取一个最小值,作为所有-1位产生的最少逆序对数。

  然后加上原来有的数产生的逆序对数就可以了。


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=10000+5,M=100+5;
int n,m,a[N],sml[N][M],big[N][M],tot[N][M],rot[N][M],dp[N][M];
int main(){
scanf("%d%d",&n,&m);
memset(tot,0,sizeof tot);
memset(rot,0,sizeof rot);
memset(sml,0,sizeof sml);
memset(big,0,sizeof big);
memset(dp,0,sizeof dp);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
for (int j=1;j<=m;j++)
tot[i][j]=tot[i-1][j];
if (a[i]!=-1)
tot[i][a[i]]++;
for (int j=m;j>=1;j--)
big[i][j]=big[i][j+1]+tot[i][j];
}
for (int i=n;i>=1;i--){
for (int j=1;j<=m;j++)
rot[i][j]=rot[i+1][j];
if (a[i]!=-1)
rot[i][a[i]]++;
for (int j=1;j<=m;j++)
sml[i][j]=sml[i][j-1]+rot[i][j];
}
int tot=0;
for (int i=1;i<=n;i++){
int Min=1<<28;
if (a[i]!=-1)
tot+=big[i-1][a[i]+1]+sml[i+1][a[i]-1];
for (int j=1;j<=m;j++){
if (a[i]!=-1){
dp[i][j]=dp[i-1][j];
continue;
}
Min=min(Min,dp[i-1][j]);
dp[i][j]=Min+big[i-1][j+1]+sml[i+1][j-1];
}
}
int ans=1<<28;
for (int i=1;i<=m;i++)
ans=min(ans,dp[n][i]);
printf("%d",ans+tot/2);
return 0;
}

  

BZOJ1786 [Ahoi2008]Pair 配对 动态规划 逆序对的更多相关文章

  1. BZOJ1786&colon; &lbrack;Ahoi2008&rsqb;Pair 配对&sol;1831&colon; &lbrack;AHOI2008&rsqb;逆序对

    这两道题是一样的. 可以发现,-1变成的数是单调不降. 记录下原有的逆序对个数. 预处理出每个点取每个值所产生的逆序对个数,然后dp转移. #include<cstring> #inclu ...

  2. bzoj1786&colon; &lbrack;Ahoi2008&rsqb;Pair 配对&amp&semi;&amp&semi;1831&colon; &lbrack;AHOI2008&rsqb;逆序对

    一个自以为很对的东西,我们往-1放的数肯定是不增的. 然后就预处理一下,假如i这个位置放j会多多少逆序对. DP一下,我的复杂度应该是O(n*m^2)的,然而你随便搞都能省掉一个m吧,我算了算好像可以 ...

  3. 【BZOJ1786】&lbrack;Ahoi2008&rsqb;Pair 配对 DP

    [BZOJ1786][Ahoi2008]Pair 配对 Description Input Output Sample Input 5 4 4 2 -1 -1 3 Sample Output 4 题解 ...

  4. 【BZOJ1786】&lbrack;Ahoi2008&rsqb;Pair 配对

    题解: 打表出奇迹 能发现所有ai一定是不减的 其实很好证明啊.. 考虑两个位置x y(y在x右边) x的最优值已经知道了 考虑y处 先让y=x,然后开始变化 因为x处已经是最优的了,所以如果减小,那 ...

  5. B1786 &lbrack;Ahoi2008&rsqb;Pair 配对 逆序对&plus;dp

    这个题有点意思,一开始没想到用dp,没啥思路,后来看题解才恍然大悟:k才1~100,直接枚举每个-1点的k取值进行dp就行了.先预处理出来sz[i][j]  i左边的比j大的数,lz[i][j]  i ...

  6. 【BZOJ1831】&lbrack;AHOI2008&rsqb;逆序对(动态规划)

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

  7. bzoj1831&colon; &lbrack;AHOI2008&rsqb;逆序对&lpar;DP&plus;双精bzoj1786&rpar;

    1831: [AHOI2008]逆序对 Description 小可可和小卡卡想到Y岛上旅游,但是他们不知道Y岛有多远.好在,他们找到一本古老的书,上面是这样说的: 下面是N个正整数,每个都在1~K之 ...

  8. 洛谷 P4280 bzoj1786 &lbrack;AHOI2008&rsqb;逆序对&lpar;dp&rpar;

    题面 luogu bzoj 题目大意: 给你一个长度为\(n\)的序列,元素都在\(1-k\)之间,有些是\(-1\),让你把\(-1\)也变成\(1-k\)之间的数,使得逆序对最多,求逆序对最少是多 ...

  9. &lbrack;BZOJ1786&rsqb;&lbrack;BZOJ1831&rsqb;逆序对

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

随机推荐

  1. iOS开发系列--Objective-C之类和对象

    概述 前面已经简单介绍过ObjC的基础知识,让大家对ObjC有个大致的印象,今天将重点解释ObjC面向对象的特性.ObjC相对于C语言多了面向对象特性,但是ObjC又没有其他面向对象语言那么多语法特性 ...

  2. 三维场景中使用BillBoard技术

    三维场景中对于渲染效果不是很精致的物体可以使用BillBoard技术实现,使用该技术需要将物体实时朝向摄像机,即计算billboard的旋转矩阵M. 首先根据摄像机位置cameraPos和billBo ...

  3. nonatomic&comma; retain&comma;weak&comma;strong用法详解

    strong weak strong与weak是由ARC新引入的对象变量属性 ARC引入了新的对象的新生命周期限定,即零弱引用.如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自 ...

  4. 重学《C&num;高级编程》(继承)

    前两天重新看了<C#高级编程>里的第四章:继承与第六章:数组.OOP三大特性:封装,继承,多态,个人感觉继承是实现多态的基础,包括以后接触的设计模式,都是继承特性的衍生. 继承特性有两种, ...

  5. javaXML文件解析之DOM4J实操

    既然前面说了DOM4J这里好那里好,大家都是在用这个,那咱就不得不写一个了. XML文件: <?xml version="1.0" encoding="UTF-8& ...

  6. 一款堪称完美的编程字体Source Code Pro

    对于程序员来说,好的字体应该满足的基本条件: 字母和数字易于分辨,如: 英文字母o 和 阿拉伯数字 0 ,或者 英文字母 l 和 阿拉伯数字 1 ,两个单引号 '' 和双引号 ”. 字体等宽,保持对齐 ...

  7. Windows 登录用户的类型

    转载:http://blog.csdn.net/chenlycly/article/details/45419259 1.登录的是超级管理员Administrator 默认情况下,超级管理员Admin ...

  8. 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比

    一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库.    关系模型1970年提出的,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型.    简单来说,关系模型指的 ...

  9. MyBatis基本配置和实践&lpar;四)

    一.Mybatis整合spring 1.整合思路 SqlSessionFactory对象应该放到spring容器中作为单例存在. 传统dao的开发方式中,应该从spring容器中获得sqlsessio ...

  10. android最新版 极光推送

    极光推送对于移动开发的程序员都不陌生,用起来也挺方便的,今天在这里给大家介绍下最先版的极光推送的用法,超级简单. 1.在build.gradle里面添加两个方法并引用一个库文件 1.1在default ...