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 ...
随机推荐
- Sublime中输入中文的解决方案
之前系统用的输入法是 ibus,在sublime中无法使用, 可能是不支持该输入法. 然后改用 fcitx,切换输入法之后要重启系统才可以生效, 启动之后就可以使用中文了.
- PyChram创建虚拟环境
目录 1. python创建虚拟环境 2. pycharm中添加python虚拟环境 1. python创建虚拟环境 首先要安装virtualenv模块.打开命令行,输入pip install vir ...
- metro扁平UI网页组件
在线演示 本地下载
- day39-Spring 18-Spring的JDBC模板:查询的操作
package cn.itcast.spring3.demo2; import java.sql.ResultSet; import java.sql.SQLException; import jav ...
- Hdu 1729 Nim博弈
点击打开题目链接 之前没做过这题,因为学弟问到我如果来求该题的sg值,才做了这题. 首先, 是多堆Nim博弈毫无疑问,这题是往一个有固定容量的箱子里放石子,和从一堆石子里面拿出石子是一个道理. 和传统 ...
- 【JZOJ2224】【NOI2006】最大获利
题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成 ...
- MySQL中使用LIMIT进行分页的方法
一.分页需求: 客户端通过传递start(页码),pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和 ...
- 自己动手打造基于 WKWebView 的混合开发框架(一)WKWebView 上手
http://www.cocoachina.com/ios/20150911/13301.html 代码示例:https://github.com/johnlui/Swift-On-iOS/tree/ ...
- 2018-12-24-win10-uwp-求两个矩形相连的几何
title author date CreateTime categories win10 uwp 求两个矩形相连的几何 lindexi 2018-12-24 20:51:49 +0800 2018- ...
- 【ToReadList】六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)(转载)
问题描述: 连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个. 比如例如给定序列: { -2, 11, -4, 13, -5, -2 } 其最大连续子序列为{ 11, ...