博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HNOI2010 合唱队
阅读量:4648 次
发布时间:2019-06-09

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

这应该又是一道 HNOI 的普及 DP 吧。。。

可以发现,每次插入后都将是一个连续的区间,所以就是区间 DP 辣

\(f(i,j,0)\) 为区间 \([i,j]\) 最后一个推进 \(i\) 的方案数,\(f(i,j,1)\) 为最后一个推进 \(j\)

\[ \begin{cases} f(i,j,0) = f(i + 1,j,0) + f(i + 1,j,1) & A_i < A_{i + 1}\;and\;A_i < A_j \\ f(i,j,1) = f(i,j - 1,1) + f(i,j - 1, 0) & A_r > A_{r - 1} \;and\;A_r > A_l \end{cases} \]
最终答案就是 \(f(1,n,0)+f(1,n,1)\)

边界条件只要将区间长度为 \(2\) 的情况特判下就行了。

#include 
#include
const int Mod = 19650827;const int MaxN = 1000 + 5;int N;int A[MaxN], Dp[MaxN][MaxN][2];inline int read(){ register int x = 0; register char ch = getchar(); while(!isdigit(ch)) ch = getchar(); while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); } return x;}int main(){ N = read(); for(int i = 1; i <= N; ++i) A[i] = read(); for(int len = 2; len <= N; ++len) { for(int l = 1; l + len - 1 <= N; ++l) { int r = l + len - 1; if(len == 2) { if(A[l] < A[r]) Dp[l][r][0] = Dp[l][r][1] = 1; continue; } if(A[l] < A[l + 1]) Dp[l][r][0] += Dp[l + 1][r][0]; if(A[l] < A[r]) Dp[l][r][0] += Dp[l + 1][r][1]; Dp[l][r][0] %= Mod; if(A[r] > A[r - 1]) Dp[l][r][1] += Dp[l][r - 1][1]; if(A[r] > A[l]) Dp[l][r][1] += Dp[l][r - 1][0]; Dp[l][r][1] %= Mod; } } printf("%d\n", (Dp[1][N][0] + Dp[1][N][1]) % Mod); return 0;}

转载于:https://www.cnblogs.com/zcdhj/p/9396509.html

你可能感兴趣的文章
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>
Python基础-time and datetime
查看>>
Linux epoll 笔记(高并发事件处理机制)
查看>>
shell脚本练习01
查看>>
WPF图标拾取器
查看>>
通过取父级for循环的i来理解闭包,iife,匿名函数
查看>>
HDU 3374 String Problem
查看>>
数据集
查看>>
[Leetcode] unique paths ii 独特路径
查看>>
HDU 1217 Arbitrage (Floyd + SPFA判环)
查看>>
IntelliJ idea学习资源
查看>>
Django Rest Framework -解析器
查看>>
ExtJs 分组表格控件----监听
查看>>
Hibernate二级缓存配置
查看>>
LoadRunner常用术语
查看>>
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>