博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj千题计划211:bzoj1996: [Hnoi2010]chorus 合唱队
阅读量:6691 次
发布时间:2019-06-25

本文共 1209 字,大约阅读时间需要 4 分钟。

 

f[i][j][0/1] 表示已经排出队形中的[i,j],最后一个插入的人在[i,j]的i或j

 

枚举顺序一:

先枚举区间长度,再枚举区间左端点

 

枚举顺序二:

先倒序枚举区间左端点,再枚举区间右端点

 

初始化:

当长度为2时,转移方程中的j==i+1,i==j-1

令f[i][j]只累加一次,所以f[i][i][0]=1 或者是 f[i][i][1]=1都行

 

#include
#include
using namespace std;#define N 1001const int mod=19650827;int a[N];int f[N][N][2];void read(int &x){ x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }}int main(){ int n; read(n); for(int i=1;i<=n;++i) read(a[i]); for(int i=1;i<=n;++i) f[i][i][1]=1; int j; for(int len=2;len<=n;++len) for(int i=1;i+len-1<=n;++i) { j=i+len-1; if(a[i]
a[i]) f[i][j][1]+=f[i][j-1][0]; if(a[j]>a[j-1]) f[i][j][1]+=f[i][j-1][1]; while(f[i][j][0]>=mod) f[i][j][0]-=mod; while(f[i][j][1]>=mod) f[i][j][1]-=mod; } int ans=f[1][n][0]+f[1][n][1]; if(ans>=mod) ans-=mod; cout<

 

1996: [Hnoi2010]chorus 合唱队

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 1891  Solved: 1232
[][][]

Description

Input

Output

Sample Input

4
1701 1702 1703 1704

Sample Output

8

HINT

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8266689.html

你可能感兴趣的文章
买房必知的五大法律常识 助你安心顺利选房
查看>>
leetcode563
查看>>
剑指Offer 40 最小的k个数
查看>>
winform创建树形菜单的无限级分类
查看>>
017——数组(十七) asort ksort rsort arsort krsort
查看>>
从此不再惧怕URI编码:JavaScript及C# URI编码详解
查看>>
[OpenGL] glVertexAttribPointer函数与glVertexAttribIPointer函数使用中遇到的小坑(int类型被自动转换为float类型)...
查看>>
oracle添加控制文件,ORA-00214: 错误
查看>>
SQL 语句技巧--单列数据变多行数据
查看>>
面试问题总结
查看>>
HTML特殊转义字符列表
查看>>
2、NIO--缓冲区(Buffer)
查看>>
3、集合--AbstractCollection、AbstractList源码
查看>>
如何较为直观的打印二叉树
查看>>
2014年计划:
查看>>
USACO习题:Broken Necklace
查看>>
打包命令
查看>>
POJ 1679 The Unique MST 【最小生成树/次小生成树模板】
查看>>
什么是动态链接库
查看>>
mysqldump 定时任务 执行后备份的文件为空
查看>>