洛谷P3205合唱队——区间DP

题目:https://www.luogu.org/problemnew/show/P3205

枚举点,分类为上一个区间的左端点或右端点,满足条件便+=即可;

注意不要重复(当l=2时)。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int n,h[1005],dp[1005][1005][3],p=19650827;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&h[i]);
        dp[i][i][0]=1;
        dp[i][i][1]=1;
    }
    for(int l=2;l<=n;l++)
        for(int i=1;i<=n;i++)
        {
            int j=i+l-1;
            if(j>n)continue;
            if(h[i]<h[i+1])dp[i][j][0]+=dp[i+1][j][0]; dp[i][j][0]%=p;
            if(h[i]<h[j]&&j!=i+1)dp[i][j][0]+=dp[i+1][j][1]; dp[i][j][0]%=p;
            if(h[j]>h[i])dp[i][j][1]+=dp[i][j-1][0]; dp[i][j][1]%=p;
            if(h[j]>h[j-1]&&j-1!=i)dp[i][j][1]+=dp[i][j-1][1]; dp[i][j][1]%=p;
        }
    printf("%d",(dp[1][n][0]+dp[1][n][1])%p);
    return 0;
}

  

原文地址:https://www.cnblogs.com/Zinn/p/8456997.html

时间: 2024-10-07 10:41:32

洛谷P3205合唱队——区间DP的相关文章

洛谷 [P3205] 合唱队

区间DP 手动模拟一下,我们发现本题就是一个左右加数的区间DP #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int MAXN = 1005, MOD = 19650827; int num[MAXN]

洛谷P2018 消息传递 树形DP

洛谷P2018 消息传递 树形DP dp[ u ] 表示 u 节点 已经被传到,然后将其字节点都传到所需要的最少时间 可知一个原则 一个树中的子树中如果同时开始传,那么最晚才能传到的,那他肯定最先开始传 因为本身需要的时间就大了,如果再晚一点开始,就要更晚才能结束了 也就是说从叶子向根传,将一个树中的子树 按照 他们直接传所需要的时间排序优先传大的,再传小的 也就是一个点 只要负责好传到他们的儿子那些点就够了 1 #include <cstdio> 2 #include <cmath&g

洛谷P1108 低价购买[DP | LIS方案数]

题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循“低价购买:再低价购买”的原则.写一个程序计算最大购买次数. 这里是某支股票的价格清单: 日期 1 2

洛谷P1244 青蛙过河 DP/思路

又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的人生经验理解能力. 题目想必已知,我就提几点可能会搞错的点吧. 1.题目说了青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D:但却不能跳到A,B上再跳回来.所以不可以脑补成汉内塔那种跳法. 2.青蛙只能跳到比它大1号的青蛙上面,而不是比他大的青蛙就行.所以不可以脑补

【BZOJ1996】【HNOI2010】合唱队 [区间DP]

合唱队 Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Main idea 给定一个元素两两不相等的目标序列,每次按照给定方式将一个元素加入到序列当中,问得到目标序列的方案有几种.(加元素的方式:如果加的这个元素比上一个加入的元素小的话则放在队头,否则放在队

洛谷P2879 [USACO07JAN]区间统计Tallest Cow

To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with th

洛谷1890 gcd区间

题目描述 给定一行n个正整数a[1]..a[n].m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m.第二行n个整数表示a[1]..a[n].以下m行,每行2个整数表示询问区间的左右端点.保证输入数据合法. 输出格式: 共m行,每行表示一个询问的答案. 输入输出样例 输入样例#1: 5 3 4 12 3 6 7 1 3 2 3 5 5 输出样例#1: 1 3 7 说明 对于30%的数据,n <= 100, m <=

BZOJ1996 合唱队 区间DP

OJ地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1996 设dp(i,j,k)代表在理想结果中[i,j]段最后添加的是i或j(k=0or1) 要注意的一点是程序会计算两次i=j时的情况 要特殊判断 数据不大 我写的是记忆化搜索 改成递推会更快一点 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5

洛谷P2362 围栏木桩----dp思路

在翻dp水题的时候找到的有趣的题0v0 原文>>https://www.luogu.org/problem/show?pid=2362<< 题目描述 某农场有一个由按编号排列的n根木桩构成的首尾不相连的围栏.现要在这个围栏中选取一些木桩,按照原有的编号次序排列之后,这些木桩高度成一个升序序列.所谓的升序序列就是序列中的任何一个数都不小于它之前的任何一个数.试编写程序从这个围栏中选取合适的木桩使得选出的木桩个数t最大,并求出选取出t根木桩的方案总数c. 输入输出格式 输入格式: 文件