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

P3205 [HNOI2010]合唱队

时间:2022-11-07 21:22:51浏览次数:83  
标签:合唱队 int HNOI2010 入队 P3205 getchar Mod

P3205 [HNOI2010]合唱队

题目大意:

一个排队方式,共 \(n\) 个人( $ n\leq 1000$),如果当前人的身高大于前一个,那么将这个人排在前一个人右边,如果当前人身高小于前

一个人,那么将这个人排在前一个人左边。

现在给出最终排队顺序,求多少种初始队形方案可以得到最终结果。(答案\(\mod 19650827\))

思路:

我们发现对于一个大区间的方案数,可以由一个更小的区间推得,所以可以想到区间 \(dp\) 。

我们设 \(f[i][j][0]\) 表示最后一个人从左边入队得到区间 \(i \to j\) 的方案数,\(f[i][j][1]\) 表示最后一个人从右边入队得到区间 \(i \to j\) 的方案数。

如果当前一个人从左边入队:

\(a[i] < a[i + 1],\ f[i][j][0] += f[i + 1][j][0]\)

\(a[i] < a[j],\ f[i][j][0] += f[i + 1][j][1]\)

如果当前一个人从右边入队:

\(a[j] > a[j - 1],\ f[i][j][1] += f[i][j - 1][1]\)

\(a[j] > a[i],\ f[i][j][1] += f[i][j - 1][0]\)

代码:

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

const int N = 1e3 + 5;
const int Mod = 19650827;
int n, a[N], f[N][N][5];

inline int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (!isdigit(c)) {
		if (c == '-') f = -1;
		c = getchar();
	}
	while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
	return x * f;
}

int main() {
	n = read();
	for (int i = 1; i <= n; ++i)
		a[i] = read();
	for (int i = 1; i <= n; ++i)
		f[i][i][0] = 1;
	for (int k = 1; k <= n; ++k) {
		for (int i = 1; i <= n && i + k - 1<= n; ++i) {
			int j = i + k - 1;
			if (a[i] < a[j]) f[i][j][0] += f[i + 1][j][1];
			if (a[j] > a[j - 1]) f[i][j][1] += f[i][j - 1][1];
			if (a[i] < a[i + 1]) f[i][j][0] += f[i + 1][j][0];
			if (a[j] > a[i]) f[i][j][1] += f[i][j - 1][0];
			f[i][j][0] %= Mod;
			f[i][j][1] %= Mod;
		}
	}
	printf("%d\n", (f[1][n][1] + f[1][n][0]) % Mod);
	return 0;
} 

标签:合唱队,int,HNOI2010,入队,P3205,getchar,Mod
From: https://www.cnblogs.com/Miraclys/p/16867520.html

相关文章

  • 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-......