bzoj1996【HNOI2010】chorus 合唱队
2016-02-27 20:15
429 查看
1996: [Hnoi2010]chorus 合唱队
Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1301 Solved: 830
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
41701 1702 1703 1704
Sample Output
8HINT
Source
f[i][j][0]和f[i][j][1]分别表示从i到j,最后一个从前和从后加入的方案数,然后就可以DP了。(转移方程详见程序)注意i=j和i+1=j的特殊情况。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define F(i,j,n) for(int i=j;i<=n;i++) #define D(i,j,n) for(int i=j;i>=n;i--) #define ll long long #define maxn 2005 #define mod 19650827 using namespace std; int n; int a[maxn],f[maxn][maxn][2]; inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int main() { n=read(); F(i,1,n) a[i]=read(); memset(f,0,sizeof(f)); F(i,1,n) f[i][i][0]=f[i][i][1]=1; D(i,n-1,1) F(j,i+1,n) { if (i+1==j) { if (a[i]<a[j]) (f[i][j][0]+=1)%=mod,(f[i][j][1]+=1)%=mod; continue; } if (a[i]<a[i+1]) (f[i][j][0]+=f[i+1][j][0])%=mod; if (a[i]<a[j]) (f[i][j][0]+=f[i+1][j][1])%=mod; if (a[j]>a[i]) (f[i][j][1]+=f[i][j-1][0])%=mod; if (a[j]>a[j-1]) (f[i][j][1]+=f[i][j-1][1])%=mod; } printf("%d\n",(f[1] [0]+f[1] [1])%mod); }
相关文章推荐
- [hdu5632][BC#73 1002]Rikka with Array
- JavaScript特效5-完整tab选项卡
- 深度学习材料:从感知机到深度网络A Deep Learning Tutorial: From Perceptrons to Deep Networks
- poj 3259 Wormholes (Bellman-ford)
- ZOJ 3778 11th省赛 C Talented Chef
- 【HDU 5438】Ponds
- NTP服务器配置
- hdu 4267 A Simple Problem with Integers 树状数组
- Android应用的自动升级、更新模块的实现
- 往SQLiteDatabase利用API或普通SQL语句增删改查数据详解
- bzoj2287【POJ Challenge】消失之物
- 实现卡片翻转的动画效果
- LeetCode题解:Reverse Linked List
- bzoj1710【Usaco2007 Open】Cheappal 廉价回文
- Ubuntu 14.04 部署 CEPH集群
- 解决System进程占用80端口
- 关于Gson的各数据类型转换
- usaco 第一章博客指引
- ubuntu 启动长时间黑屏解决
- Android 完美实现图片圆角和圆形(对实现进行分析)