【BZOJ4621】Tc605

Description

最初你有一个长度为 N 的数字序列 A。为了方便起见,序列 A 是一个排列。
你可以操作最多 K 次。每一次操作你可以先选定一个 A 的一个子串,然后将这个子串的数字全部变成原来这个子串的最大值。问最终有几种可能的数字序列。答案对 1e9+7 取模。

Input

第一行两个数 N 和 K。第二行 N 个数,描述一个排列 A。 
N,K<=500,
有6组数据N>100,有梯度

Output

输出一个数,表示答案在模域下的值。 

Sample Input

3 2
3 1 2

Sample Output

4

题解:好题。

先预处理出每个数左边和右边第一个比它大的数的位置ls,rs,然后将这个数看成一个区间,问题就变成了选出一些区间覆盖整个序列的方案数。用f[i][j]表示覆盖到位置i,已选择了j个区间的方案数。那么对于所有ls<=i<=rs,用$\sum\limits_{k=ls-1}^{i-1}f[k][j-1]$更新即可,显然可以用前缀和优化。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int P=1000000007;
int n,m,ans,sum;
int f[510][510],v[510];
int main()
{
scanf("%d%d",&n,&m);
int i,j,k,ls,rs;
for(i=1;i<=n;i++) scanf("%d",&v[i]);
f[0][0]=1;
for(i=1;i<=n;i++)
{
for(ls=i;ls>1&&v[ls-1]<v[i];ls--);
for(rs=i;rs<n&&v[rs+1]<v[i];rs++);
for(j=m;j>=0;j--)
{
f[i][j]=(f[i][j]+f[i-1][j])%P;
if(j)
{
sum=0;
for(k=ls;k<=rs;k++) sum=(sum+f[k-1][j-1])%P,f[k][j]=(f[k][j]+sum)%P;
f[i][j]=(f[i][j]-f[i-1][j-1]+P)%P;
}
}
}
for(i=0;i<=m;i++) ans=(ans+f[n][i])%P;
printf("%d",ans);
return 0;
}//3 2 1 2 3

最新文章

  1. 加速下载gradle
  2. MacDev.Mach-O.Programming-Part-III:MachOView-v2.4.9200.dmg-crash
  3. Ubuntu14.04下jdk的安装
  4. crawler: 常用的一些工具
  5. VS2010+Opencv+SIFT以及出现的问题-关于代码sift_3_c的说明
  6. &lt;转&gt;键盘扫描码
  7. 【canvas系列】canvas实现“ 简单的Amaziograph效果”--画对称图
  8. Life in Changsha College-第一次冲刺
  9. HighCharts之2D对数饼图
  10. Spring Cloud学习笔记-003
  11. 【RL-TCPnet网络教程】第21章 RL-TCPnet之高效的事件触发框架
  12. All You Can Code 2008 (Romanian Contest) A - Tree Search
  13. Validate常用校验
  14. python turtle 例子 海归绘图
  15. Vue2.0 分页插件pagination使用详细说明
  16. Ubuntu14.04安装Torch7笔记
  17. IDEA配置maven中央库
  18. 解决mysql中limit和in不能同时使用的问题
  19. Linux系统——FTP
  20. Android提交自己的作品到GitHub上

热门文章

  1. :not() 选择器选取除了指定元素以外的所有元素
  2. jBoss设置jvm参数
  3. Linux top命令的图解使用
  4. UIPopoverController具体解释
  5. pdo连接mysql操作方法
  6. 从【MySQL server has gone away】说起
  7. google_gflags使用
  8. HDU 1358 Period(kmp简单解决)
  9. Itunes connect上传应用视频 app preview时遇到“无法载入文件”的问题
  10. iOS 解决xcode设置全局断点后 执行视频播放时自动进入断点cxa_throw