首页 > 其他分享 >P3205 [HNOI2010]合唱队

P3205 [HNOI2010]合唱队

时间:2023-04-16 18:34:55浏览次数:56  
标签:1701 1702 合唱队 int HNOI2010 队列 队尾 P3205 一人

P3205 [HNOI2010]合唱队

区间DP——取一端

思:

根据题意我们发现,每次排队的时候,会出现两种情况

  • 当前排入的人(即初始队列最后一人)比初始队列中前一个人矮,排到最左边
  • 当前排入的人(同上)比初始队列中前一个人高,排到最右边

可从初始队列最后一人切入。

设置状态:\(f[l][r][0/1]\)表示初始队列最后一个人排到理想队列\(l\)~\(r\)的队首或队尾,f存的值为原始队列的方案数。

0表示从插入队头,1表示插入队尾。

原始推目标,目标再推回原始。感觉有点绕,画图大法非常好。

(以最后一人插入队头为例,插入队尾举一反三.

通过\(h[l]\)与\(h[l+1]\)和\(h[r]\)的关系来判断最后一人r与前一人r-1的关系。

举样例:

4
1701 1702 1703 1704

枚举区间1~3(1701,1702,1703)时

1701的前面若是1702(a[l]<a[l+1]),则原始序列中1702是比前一个人矮才来到2~3的队首。

1701的前面若是1703(a[l]<a[r]),则原始序列1703是比前一个人高才来到2~3的队尾。

(防止混淆,不是1702既来队首,又有来队尾的可能。

注意初始化。

转移方程为:

最后一人在队首时

if(h[l+1]>h[l]) f[l][r][0]+=f[l+1][r][0];//最后一人的前面的人来l+1~r的队头

if(h[r]>h[l]) f[l][r][0]+=f[l+1][r][1];//来l+1~r的队尾

在队尾

if(h[l]<h[r]) f[l][r][1]+=f[l][r-1][0];//来l~r-1的队头

if(h[r-1]<h[r]) f[l][r][1]+=f[l][r-1][1];//来l~r-1的队尾

枚举区间段即可。

#include <bits/stdc++.h>
using namespace std;
const int N =1e3+10,mod=19650827;
int f[N][N][2],h[N],n;
void add(int &x,int k){//计算取模
	x=(x+k)%mod;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>h[i];
		f[i][i][0]=1;//初始化
	}
	for(int len=2;len<=n;len++){//枚举区间长度,从2开始,1没必要。
		for(int l=1;l+len-1<=n;l++){//枚举区间段
			int r=l+len-1;
			if(h[l+1]>h[l]) add(f[l][r][0],f[l+1][r][0]);
			if(h[r]>h[l]) add(f[l][r][0],f[l+1][r][1]);
			if(h[l]<h[r]) add(f[l][r][1],f[l][r-1][0]);
			if(h[r-1]<h[r]) add(f[l][r][1],f[l][r-1][1]);
		} 
	}
	cout<<(f[1][n][0]+f[1][n][1])%mod;//总方案为最后一人来队首和队尾方案之和,取模。
	return 0;
}

标签:1701,1702,合唱队,int,HNOI2010,队列,队尾,P3205,一人
From: https://www.cnblogs.com/lcj-blogs/p/17323786.html

相关文章

  • 「背包DP」合唱队形
    本题为3月16日23上半学期集训每日一题中A题的题解题面题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈......
  • P3205 [HNOI2010]合唱队(区间dp+方案数)
    P3205[HNOI2010]合唱队-洛谷|计算机科学教育新生态(luogu.com.cn)这道题大区间包括小区间,每加一个人都会让区间更大;考虑区间DP:对于区间[i~j],这段区间最新......
  • P1091 合唱队形
    题意:有n名学生在成一排。然后为了站成中间高两边矮的合唱队列,问最少不要几个人? 思路:就是最长上升子序列裸用。当然是先把顺方向和逆方向的最长上升子序列找到。然后......
  • SPOJ SP32058 R6PL - Harbinger vs Sciencepal
    链接难度:\(\texttt{17/21}\)\(T\)组数据。有\(n\)组,每组有\(2\)个数\(x,y\),问把每组的一个数分配到一组另一个数分配到另一组两组数字和差的绝对值最小是多少。......
  • P1091 合唱队形
    P1091合唱队形题意:给出一个长度为\(n\)的序列,要求从中删去一些数字,假设剩下的新的\(a\)数组,要求存在\(a[1]<a[2]<...<a[i]>a[i+1]>...a[k]\)。求删去的......
  • P3205 [HNOI2010]合唱队
    P3205[HNOI2010]合唱队题目大意:一个排队方式,共\(n\)个人($n\leq1000$),如果当前人的身高大于前一个,那么将这个人排在前一个人右边,如果当前人身高小于前一个人,那么......
  • P3205 [HNOI2010]合唱队
    思路我们用\(f_{i,j,0}\)表示当前\([i,j]\)的人都已经入队了,并且\(i\)是从左边进的(\(0\)),或\(j\)是从右边进的(\(1\))。具体细节见代码。代码#include<iostream>#includ......
  • #yyds干货盘点# 动态规划专题:合唱队形
    1.简述:描述N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高......
  • dp4 合唱队形
    地址:http://bailian.openjudge.cn/practice/2711/最长上升子序列的板子#include<bits/stdc++.h>usingnamespacestd;constintN=1010;intn;inta[N];intres;......
  • 2022/8/18 动态规划复习(内含Caesar's Legions,数字游戏,合唱队形,The Battle of Chibi,Que
    QueriesforNumberofPalindromes标签:回文类区间dp 一道典型的区间dp。注意求的是个数而不是长度。初始化的时候注意一下,len=2时分两种情况。ch[i]=ch[i-1]时,dp[i-......