51nod1370 排列与操作
性质:最终值域相同的一定是连续一段
花费最小?一定是值域个数个!并且当最后为i的数恰好只有i一个位置的时候,肯定选择不动,少花费一个
所以,我们考虑:每个最终方案在花费最小的方案下恰好被统计一次!
而对于一个合法的最终序列,考虑是怎样构造的
一定是先构造小的数,填充一些区间,再用大的数,可能覆盖一些小数的区间
换句话说,只要每个数的能填充这一段区间,就是合法的
也就是这个区间不能存在比这个数大的数!
有了这个发现,DP状态和转移就容易设计了
连续一段好处理,但是怎么知道之前没有出现过这个数?
还和位置有关,所以考虑顺序DP,到了i位置,考虑a[i]在最终序列的出现情况
f[i][j][k]考虑完了前i个位置,最终序列确定了前j个,花费k次
1.f[i-1][i-1][k]->f[i][i][k]i单独一块,不花费
2.f[i-1][j'][k-1]->f[i][j][k]把[j'+1,j]都变成a[i],前提是[j'+1,j]没有比a[i]大的,可以提前找到[l,r]极大的区间都<=a[i]
特别地,当j=i的时候,j'<j-1,否则白白花费一个代价,不满足“每个最终方案在花费最小的方案下恰好被统计一次!”,我们在第一个转移考虑了,这样会算重
3.f[i-1][j][k]->f[i][j][k],a[i]这个数不会出现在值域集合内。直接覆盖
第2个用前缀和优化即可
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=;
const int mod=1e9+;
int n,m;
int f[N][N][N],s[N][N][N];
int a[N];
int ad(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
void clear(){
memset(f,,sizeof f);memset(s,,sizeof s);
}
int main(){
int t;rd(t);
while(t--){
clear();
rd(n);rd(m);
for(reg i=;i<=n;++i) rd(a[i]);
f[][][]=;
for(reg j=;j<=n;++j) s[][j][]=;
for(reg i=;i<=n;++i){
int l=i,r=i;
while(l>&&a[l-]<a[i]) --l;
while(r<n&&a[r+]<a[i]) ++r;
// cout<<" i "<<i<<" : "<<l<<" and "<<r<<endl;
for(reg k=;k<=m;++k){
f[i][i][k]=ad(f[i][i][k],f[i-][i-][k]);
for(reg j=;j<=n;++j){
if(l<=j&&j<=r){
if(j==i){
if(j->=&&l->=) f[i][j][k]=ad(f[i][j][k],ad(s[i-][j-][k-],mod-s[i-][l-][k-]));
else if(j->=) f[i][j][k]=ad(f[i][j][k],s[i-][j-][k-]);
}else{
f[i][j][k]=ad(f[i][j][k],ad(s[i-][j-][k-],l->=?mod-s[i-][l-][k-]:));
}
}
f[i][j][k]=ad(f[i][j][k],f[i-][j][k]);
}
}
for(reg k=;k<=m;++k){
for(reg j=;j<=n;++j){
s[i][j][k]=f[i][j][k];
if(j) s[i][j][k]=ad(s[i][j][k],s[i][j-][k]);
}
}
}
// for(reg i=0;i<=n;++i){
// for(reg j=0;j<=n;++j){
// for(reg k=0;k<=m;++k){
// // cout<<" i j k "<<i<<" "<<j<<" "<<k<<" : "<<f[i][j][k]<<" s "<<s[i][j][k]<<endl;
// }
// }
// }
ll ans=;
for(reg k=;k<=m;++k) ans=ad(ans,f[n][n][k]);
printf("%lld\n",ans);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
51nod1370 排列与操作的更多相关文章
- python字符串及字符串操作
字符串介绍 1.字符串在内存中的存储: 2.字符串相加: 3.字符串的格式化: In [1]: a = 100 In [2]: a Out[2]: 100 #100<255,在堆内存下占用了一个 ...
- Windows Store App 过渡动画
Windows Store App 过渡动画 在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...
- Learning WCF Chapter1 Exposing Multiple Service Endpoints
So far in this chapter,I have shown you different ways to create services,how to expose a service en ...
- tp剩余未验证内容-7
bash脚本中 的 set -e表示 exit immediately if a simple command returns a non-zero value.主要是为了防止错误被忽略.会被立即退出 ...
- SQL知识点、SQL语句学习
一. 数据库简介和创建1. 系统数据库在安装好SQL SERVER后,系统会自动安装5个用于维护系统正常运行的系统数据库: (1)master:记录了SQL SERVER实例的所有系统级消息,包括实例 ...
- Report CodeForces - 631C (栈)
题目链接 题目大意:给定序列, 给定若干操作, 每次操作将$[1,r]$元素升序或降序排列, 求操作完序列 首先可以发现对最后结果有影响的序列$r$一定非增, 并且是升序降序交替的 可以用单调栈维护这 ...
- 十分钟掌握pandas(pandas官方文档翻译)
十分钟掌握pandas 文档版本:0.20.3 这是一个对pandas简短的介绍,适合新用户.你可以在Cookbook中查看更详细的内容. 通常,我们要像下面一样导入一些包. In [1]: impo ...
- iOS开发——使用基于Autolayout的ScrollView
问题描述: 在使用Autolayout布局方式对ScrollView进行布局时,如果你想做一个可以垂直方向滚动的九宫格类似这样: 拿一行来说,一定不要想当然的尝试去给一行图标进行均匀排列的操作(指 ...
- Mongodb基本操作入门,增删改查和索引
主要进程 mongod.exe为启动数据库实例的进程. mongo是一个与mongod进程进行交互的JavaScript shell进程,它提供了一些交互的接口函数用户对数据库的管理. 基本命令 sh ...
随机推荐
- 【有用】rn-viewpager中的IndicatorViewPager
实现引导页滑动 //js/pages/GuidePage.js import {StyleSheet, View, Button, Text, Image, TouchableOpacity,Asyn ...
- linux类库之log4j-LogBack-slf4j-commons-logging
log4j http://commons.apache.org/proper/commons-logging/ http://logging.apache.org/log4j/2.x/ The Com ...
- Spark day06
SparkStreaming简介 SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展.高吞吐量.容错的实时数据流处理,实时数据的来源可以是:Kafka, Flume, ...
- jmeter的运行原理和测试计划要素
jmeter运行原理 1.jmeter运行在JVM虚拟机上,jmeter是以线程的方式运行的. 2.jmeter通过线程组来驱动多个线程,运行测试脚本对被测试服务器发起负载,每一个负载机上够可以运行多 ...
- Word画线条5大技巧,简单实用!
[Word画线条5大技巧,简单实用!]1.输入三个“=”,回车,就是一条双直线:2.输入三个“~”,回车,就是一条波浪线:3.输入三个“”回车,就是一条虚线:4.输入三个“-”,回车,就是一条直线:5 ...
- python系列之(5)PyMySQL的使用
简介 PyMySQL是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中是使用mysqldb. 安装 pip3 install pymysql 创建连接 #!/usr ...
- poj 1845 【数论:逆元,二分(乘法),拓展欧几里得,费马小定理】
POJ 1845 题意不说了,网上一大堆.此题做了一天,必须要整理一下了. 刚开始用费马小定理做,WA.(poj敢说我代码WA???)(以下代码其实都不严谨,按照数据要求A是可以等于0的,那么结果自然 ...
- Django框架form表单配合ajax注册
总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 下面是写的登录页面的实例 1:views视图中的代码 # 注册页面 def regi ...
- HDU 5584 LCM Walk【搜索】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 分析: 这题比赛的时候卡了很久,一直在用数论的方法解决. 其实从终点往前推就可以发现, ...
- JPA中id前面有空格导致的"Column 'id' not found"问题
问题背景 昨晚有个同事发生了一个神奇的问题,一如既往的问题,一如既然的用我写的BEJSON-JAVA代码生成器生成,却发现一直提示Column 'id' not found.这就很TM神奇了 2018 ...