首页 > 其他分享 >P3205 [HNOI2010]合唱队(区间dp+方案数)

P3205 [HNOI2010]合唱队(区间dp+方案数)

时间:2023-03-01 23:02:04浏览次数:61  
标签:ch 加入 int 最后 HNOI2010 P3205 区间 dp define

P3205 [HNOI2010]合唱队 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题 大区间包括小区间,每加一个人都会让区间更大;

考虑区间DP:

对于区间 [ i ~ j ] ,这段区间最新进的人只有两种可能 i 或 j

所以我们定义:

f[i][j]最后一个加的人是 i ,组成区间[ i ~ j ]的方案数 

g[i][j]最后一个加的人是 j ,组成区间[ i ~ j ]的方案数  

对于 f [i][j] 的转移:

f[ i ][ j ]是由区间[ i+1~j ]转移过来的,且a[i] 是要小于上一个加入的大小

对于区间[ i+1 ~ j ]同理也是有两种可能 (i+1)是这段区间最后一个加入的 或 j是这段区间最后一个加入的

如果 (i+1)是区间[i+1,j]最后一个加入的,且为了让 i 是最后一个加入的,要满足(a[i+1]>a[i])则有转移方程 f[i][j]+=f[i+1][j];

如果 (j)是区间[i+1,j]最后一个加入的,且为了让 i 是最后一个加入的,要满足(a[j]>a[i])则有转移方程 f[i][j]+=g[i+1][j];

 

对于 g [i][j] 的转移:

g[ i ][ j ]是由区间[ i~j-1 ]转移过来的,且a[j]是大于上一个加入的大小

对于区间[ i ~ j-1 ]同理也是有两种可能 i 是这段区间最后一个加入的 或 j-1 是这段区间最后一个加入的

如果 i 是区间[i,j-1]最后一个加入的,且为了让 j 是最后一个加入的,要满足(a[j]>a[i])则有转移方程 g[i][j]+=f[i][j-1];

如果 j-1 是区间[i,j-1]最后一个加入的,且为了让 j 是最后一个加入的,要满足(a[j]>a[j-1])则有转移方程 g[i][j]+=g[i][j-1];

 

对于初始化状态:

for(int i=1;i<=n;i++) f[i][i]=1;
 初始化状态不能有g[i][i]=1,(n=1的情况就能推翻,可根据常理来想)   Code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   
#define popb pop_back  
#define fi first
#define se second
const int N=1e3+10;
const int MOD=19650827;
//const int inf=0x3f3f3f3f;     
//const ll INF=0x3ffffffffffff;
int T,n,a[N],f[N][N],g[N][N];
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<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);
    n=read();
    for(int i=1;i<=n;i++) a[i]=read(); 
    for(int i=1;i<=n;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;
                f[i][j]=(f[i+1][j]*(a[i+1]>a[i])+g[i+1][j]*(a[j]>a[i]))%MOD;
                g[i][j]=(f[i][j-1]*(a[j]>a[i])+g[i][j-1]*(a[j]>a[j-1]))%MOD;
            }
    printf("%d",(f[1][n]+g[1][n])%MOD);
    return 0;
}

 

 

 

标签:ch,加入,int,最后,HNOI2010,P3205,区间,dp,define
From: https://www.cnblogs.com/Willette/p/17170219.html

相关文章

  • 区间DP模板
    区间dp一般都比较死板DP[i][len]表示从i开始,长度为len 区间dp通常数据N为300,400,500---几百的大小 for(intlen=2;len<=n;len++)for(inti=1;i+le......
  • LOJ 3276 JOISC 2020 Day2 遗迹 题解 (计数DP)
    LOJ链接UOJ链接观察一下n次地震的过程,发现最后会有n个石柱高度为0,\(1,2\cdotsn\)高度的石柱各有一个。假设现在已经确定了一种初始高度状态,我们来看看最后哪些石柱高度......
  • 单机上的UDP客户端与服务器端
    服务端:#include<stdio.h>#include<stdlib.h>#include<winsock2.h>#pragmacomment(lib,"ws2_32")staticSOCKETUdp;intudp_init(char*ip,intport){......
  • 两道区间DP题目总结
    CF1132F.CleartheString题目传送门题意:有一个字符串,每次可以删除一段连续的相同字母的子串,求删完的最小次数。做法一设\(f[l][r]\)表示\([l,r]\)删完的最小次......
  • 【MAUI】使用Navigation.PushAsync跳转到TabbedPage选中想要的Tab
    当使用TabbedPage,动态生成Tab的时候,通常默认是ItemSource绑定数据源中的第一个。当我们使用Navigation.PushAsync跳转到TabbedPage页面,我们可以使用TabbedPage的SelectedI......
  • Wordpress 漏洞利用与后渗透
    【作业】ColddBox靶场Wordpress漏洞利用与后渗透。突破口渗透这类CMS网站时,不要上来就狂扫,它大部分目录都是固定的,开源去看对应版本,商业的找几篇文章。特别注意的......
  • R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长|附代码数据
    原文链接:http://tecdat.cn/?p=12292最近我们被客户要求撰写关于HAR-RV的研究报告,包括一些图形和统计输出。我们复制了Ghysels(2013)中提供的示例。我们进行了MIDAS回归分析......
  • Xilinx XPM使用说明--XPM_MEMORY_SDPRAM
    XPM_MEMORY_SDPRAM参数化宏:简单的双端口RAM 介绍此宏用于实例化简单双端口RAM。端口A用于从存储器执行写入操作,端口B可用于从存储器读取。下面介绍XPM_MEMORY实例的......
  • 一步打通多渠道服务场景 中电金信源启移动开发平台MADP功能“上新”
    日前,中电金信源启移动开发平台MADP功能迭代升级,“上新”源启小程序开发平台。定位“为金融业定制”的移动PaaS平台,源启小程序开发平台为银行、互联网金融、保险、证券客户提......
  • DP-笔记1
    有些东西要记下来,不然就丢了。动态规划,是利用问题可以被划分为多个解法类似的子问题的性质,使用若干关键的、与解集有关的参数,称作“状态”,来描述每一个子问题。子问题是......