性质:最终值域相同的一定是连续一段

花费最小?一定是值域个数个!并且当最后为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 排列与操作的更多相关文章

  1. python字符串及字符串操作

    字符串介绍 1.字符串在内存中的存储: 2.字符串相加: 3.字符串的格式化: In [1]: a = 100 In [2]: a Out[2]: 100 #100<255,在堆内存下占用了一个 ...

  2. Windows Store App 过渡动画

    Windows Store App 过渡动画     在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...

  3. 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 ...

  4. tp剩余未验证内容-7

    bash脚本中 的 set -e表示 exit immediately if a simple command returns a non-zero value.主要是为了防止错误被忽略.会被立即退出 ...

  5. SQL知识点、SQL语句学习

    一. 数据库简介和创建1. 系统数据库在安装好SQL SERVER后,系统会自动安装5个用于维护系统正常运行的系统数据库: (1)master:记录了SQL SERVER实例的所有系统级消息,包括实例 ...

  6. Report CodeForces - 631C (栈)

    题目链接 题目大意:给定序列, 给定若干操作, 每次操作将$[1,r]$元素升序或降序排列, 求操作完序列 首先可以发现对最后结果有影响的序列$r$一定非增, 并且是升序降序交替的 可以用单调栈维护这 ...

  7. 十分钟掌握pandas(pandas官方文档翻译)

    十分钟掌握pandas 文档版本:0.20.3 这是一个对pandas简短的介绍,适合新用户.你可以在Cookbook中查看更详细的内容. 通常,我们要像下面一样导入一些包. In [1]: impo ...

  8. iOS开发——使用基于Autolayout的ScrollView

    问题描述: 在使用Autolayout布局方式对ScrollView进行布局时,如果你想做一个可以垂直方向滚动的九宫格类似这样:   拿一行来说,一定不要想当然的尝试去给一行图标进行均匀排列的操作(指 ...

  9. Mongodb基本操作入门,增删改查和索引

    主要进程 mongod.exe为启动数据库实例的进程. mongo是一个与mongod进程进行交互的JavaScript shell进程,它提供了一些交互的接口函数用户对数据库的管理. 基本命令 sh ...

随机推荐

  1. Sublime中输入中文的解决方案

    之前系统用的输入法是 ibus,在sublime中无法使用, 可能是不支持该输入法. 然后改用 fcitx,切换输入法之后要重启系统才可以生效, 启动之后就可以使用中文了.

  2. PyChram创建虚拟环境

    目录 1. python创建虚拟环境 2. pycharm中添加python虚拟环境 1. python创建虚拟环境 首先要安装virtualenv模块.打开命令行,输入pip install vir ...

  3. metro扁平UI网页组件

    在线演示 本地下载

  4. day39-Spring 18-Spring的JDBC模板:查询的操作

    package cn.itcast.spring3.demo2; import java.sql.ResultSet; import java.sql.SQLException; import jav ...

  5. Hdu 1729 Nim博弈

    点击打开题目链接 之前没做过这题,因为学弟问到我如果来求该题的sg值,才做了这题. 首先, 是多堆Nim博弈毫无疑问,这题是往一个有固定容量的箱子里放石子,和从一堆石子里面拿出石子是一个道理. 和传统 ...

  6. 【JZOJ2224】【NOI2006】最大获利

    题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成 ...

  7. MySQL中使用LIMIT进行分页的方法

    一.分页需求: 客户端通过传递start(页码),pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和 ...

  8. 自己动手打造基于 WKWebView 的混合开发框架(一)WKWebView 上手

    http://www.cocoachina.com/ios/20150911/13301.html 代码示例:https://github.com/johnlui/Swift-On-iOS/tree/ ...

  9. 2018-12-24-win10-uwp-求两个矩形相连的几何

    title author date CreateTime categories win10 uwp 求两个矩形相连的几何 lindexi 2018-12-24 20:51:49 +0800 2018- ...

  10. 【ToReadList】六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)(转载)

    问题描述:       连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个. 比如例如给定序列: { -2, 11, -4, 13, -5, -2 } 其最大连续子序列为{ 11, ...