首页 > 其他分享 >洛谷题单指南-动态规划3-P3205 [HNOI2010] 合唱队

洛谷题单指南-动态规划3-P3205 [HNOI2010] 合唱队

时间:2024-05-13 12:12:20浏览次数:13  
标签:右边 理想 int 洛谷题 插入 HNOI2010 左边 P3205 队形

原题链接:https://www.luogu.com.cn/problem/P3205

题意解读:给定理想队形,计算初始队形的方案数。

解题思路:

对于给定理想队形,最后一个人插入有两种可能:从左边插入、从右边插入

从左边插入,则意味着前一个数比当前数大,前一个数有可能在左边也有可能在右边

从右边插入,则意味着前一个数比当前数小,前一个数有可能在左边也有可能在右边

根据上述分析,可以这样来设计:

1、状态表示

设f[i][j]表示形成i~j的理想队形,最后一个插入的是i,对应从左边插入的情况

设g[i][j]表示形成i~j的理想队形,最后一个插入的是j,对应从右边插入的情况

理想队形第i个人身高h[i]。

2、状态转移

如果最后一个i从左边插入,那么前一个数大于h[i],前一个数可能是h[i+1]或者h[j]

  当h[i+1] > h[i],f[i][j] += f[i+1][j],f[i][j]加上i+1~j从左边插入的方案数

  当h[j] > h[i],f[i][j] += g[i+1][j],f[i][j]加上i+1~j从右边插入的方案数

如果最后一个j从右边插入,那么前一个数小于h[j],前一个数可能是h[i]或者h[j-1]

  当h[i] < h[j],g[i][j] += f[i][j-1],g[i][j]加上i~j-1从左边插入的方案数

  当h[j-1] < h[j],g[i][j] += g[i][j-1],g[i][j]加上i~j-1从右边插入的方案数

3、初始化

对于i=j的情况,将f[i][j]或者g[i][j]置为1即可,注意不能都置1,因为只有一个数,对应一种方案,要么认为左边插入、要么认为左边插入

4、结果

f[1][n] + g[1][n]

5、遍历方式,同常规区间问题,先枚举长度,再枚举左边界,计算右边界

6、注意每一步计算,要对f、g取模

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005, MOD = 19650827;
int n;
int h[N];
int f[N][N]; //f[i][j]表示形成i~j的理想队形,最后一个插入的是i,对应从左边插入的情况
int g[N][N]; //g[i][j]表示形成i~j的理想队形,最后一个插入的是j,对应从右边插入的情况

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> h[i];
        f[i][i] = 1;
    } 

    for(int len = 2; len <= n; len++)
    {
        for(int i = 1; i + len - 1 <= n; i++)
        {
            int j = i + len - 1;
            if(h[i+1] > h[i]) f[i][j] += f[i+1][j];
            if(h[j] > h[i]) f[i][j] += g[i+1][j];
            if(h[i] < h[j]) g[i][j] += f[i][j-1];
            if(h[j-1] < h[j]) g[i][j] += g[i][j-1];
            f[i][j] %= MOD;
            g[i][j] %= MOD;
        }
    }
    cout << (f[1][n] + g[1][n]) % MOD;

    return 0;
}

 

标签:右边,理想,int,洛谷题,插入,HNOI2010,左边,P3205,队形
From: https://www.cnblogs.com/jcwy/p/18188923

相关文章

  • 洛谷题单指南-动态规划3-Zuma
    原题链接:https://www.luogu.com.cn/problem/CF607B题意解读:从一组整数中取连续的回文子串,求最少几次可以取完。解题思路:状态表示:设dp[i][j]表示取i~j之间的回文子串所需的最少次数,a[i]表示第i个数状态转移:如果a[i]==a[j],dp[i][j]=dp[i+1][j-1],因为首尾如果相等,其必然可以......
  • 洛谷题单指南-动态规划3-P1775 石子合并(弱化版)
    原题链接:https://www.luogu.com.cn/problem/P1775题意解读:计算合并石子的最小代价,区间DP。解题思路:状态表示:dp[i][j]表示将第i~j堆石子合并的最小代价,m[i]表示第i堆石子质量,s[i]表示前i堆石子质量前缀和状态转移:考虑最后一次合并,设最后一次合并是将i~k合成的一堆与k+1~j合成......
  • 洛谷题单指南-动态规划2-P3147 [USACO16OPEN] 262144 P
    原题链接:https://www.luogu.com.cn/problem/P3147题意解读:将一组数据两两相邻且相同的合并,合并成一个数值+1的数,求合并后的最大值。解题思路:考虑合并后的最大数i,其最后一次必然是由两个i-1合并而来的设dp[i][j]表示以j为左端点,合并最大值为i时的右端点的下一个位置如图:dp[i......
  • 洛谷题单指南-动态规划2-P4310 绝世好题
    原题链接:https://www.luogu.com.cn/problem/P4310题意解读:求最长的子序列长度,使得每相邻两个元素&操作不为0。解题思路:直观来看,可以通过类似最长上升子序列的算法,进行状态转移,但是复杂度为O(n^2),会超时状态表示:dp[i]表示前i个数能产生满足条件的子序列的最长长度状态转移:dp......
  • 洛谷题单指南-动态规划2-P1833 樱花
    原题链接:https://www.luogu.com.cn/problem/P1833题意解读:在有限的时间内,看n株樱花树,第i株樱花树可以看pi次,看每株樱花树耗费时间ti,看每株樱花树一次美学值ci,求最多能看到多少美学值。解题思路:本题实质是一个混合背包问题(pi>0是多重背包,pi=0是完全背包):背包容量:总时间,可以根据......
  • 洛谷题单指南-动态规划2-P1854 花店橱窗布置
    原题链接:https://www.luogu.com.cn/problem/P1854题意解读:F束花依次放入V个花瓶,每个花瓶最多一朵,且花的顺序在花瓶中递增,计算最大的美学值,并且输出每朵花具体放置方案。解题思路:首先想到的的DFS法,对于每一朵花,枚举所有的摆放方案,累加美学值,并记录放置位置,完成一种方案就记录最......
  • 洛谷题单指南-动态规划2-P1435 [IOI2000] 回文字串
    原题链接:https://www.luogu.com.cn/problem/P1435解题思路:方法1:回文字串的特点是,正着读、反着读是一样的换一个思路,对于一个字符串s,正序、逆序公共的部分就是已经是回文的部分,剩余的部分就是要插入的字符所以,问题转换为,计算一个字符串正序、逆序的最长公共子串,然后剩下的长度......
  • 洛谷题单指南-动态规划2-P1091 [NOIP2004 提高组] 合唱队形
    原题链接:https://www.luogu.com.cn/problem/P1091题意解读:要挑选一个最长的先上升后下降的序列,求其余的元素数量解题思路:先计算正向的最长上升子序列,设f[i]表示以i结尾的正向最长上升子序列再计算逆向的最长上升子序列,设g[i]表示以i结尾的逆向最长上升子序列再枚举所有的i<j,m......
  • 洛谷题单指南-动态规划2-P1004 [NOIP2000 提高组] 方格取数
    原题链接:https://www.luogu.com.cn/problem/P1004题意解读:从起点走到终点,走两次,计算最大路径和,第一次走过的点数值变为0。解题思路:直观上思考,可以先从起点走到终点,计算最大路径和,并记录走过的所有点,然后把所有点的数值置为0,再从起点走到终点,计算最大路径和,把两次的最大路径......
  • 洛谷题单指南-动态规划2-P2679 [NOIP2015 提高组] 子串
    原题链接:https://www.luogu.com.cn/problem/P2679题意解读:在a中按顺序挑选k个子串,使得这些子串连在一起正好和b相等,求方案数。解题思路:这样的题目,无外乎两个思路:DFS暴搜(得部分分)、动态规划动态规划不好想,还是先暴搜吧!1、DFS暴搜搜索的思路就是:从a起始位置开始,一直找到跟b前......