首页 > 其他分享 >SP15637 Mr Youngs Picture Permutations 题解

SP15637 Mr Youngs Picture Permutations 题解

时间:2023-05-25 21:57:59浏览次数:40  
标签:Picture ch int 题解 Permutations long getchar DP define

题意

给定一个最多有 \(5\) 排的一个队伍,每一个位置对应一个同学,给定总人数和第 \(i\) 排 要站 \(n_i\) 个人。

要求每行左边的同学身高要大于右边的,每列从上往下要从大到小。

问:满足要求的一共有多少种方案。

思路

DP

  • 首先考虑,在这个题目中,有用的状态有每列最后的人的高度,每行最后的人的高度,每行有多少个人,每列有多少个人这么几个有用的状态。我们显然不可能去考虑这么多状态来进行转移。

  • 所以我们直接设一个五维的 DP ,每一维度表示这一行站了几个人了。那么显然, \(dp[i][j][k][l][r]\) 就表示第一行站了 \(i\) 个人 \(\dots\) 的方案数。我们的 DP 目标就是 \(dp[n_1][n_2][n_3][n_4][n_5]\) ,如果行不足 \(5\) ,我们就可以让不足的地方设为 \(0\) 就可以了。

  • 而且,我们可以将身高从高到低考虑,这样我们后放的一定比前面放的小,并且我们要满足上面一行放的数目要大于下面一行,否则就有可能不满足列单调递减了。

  • 状态转移方程:若 \(a_1 < N_1\) 并且 \(a_1 < a_0\) 时,则有 \(f[a[1]+1][a[2]][a[3]][a[4]][a[5]]+=f[a[1]][a[2]][a[3]][a[4]][a[5]]\) ,之后的转移方程都类似。

代码实现

#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define next nxt
#define re register
#define il inline
const int N = 31;
using namespace std;

long long f[N][N][N][N][N];
int n[6],a[6],k;

il int read()
{
	int f=0,s=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f |= (ch=='-');
	for(; isdigit(ch);ch=getchar()) s = (s<<1) + (s<<3) + (ch^48);
	return f ? -s : s;
}

signed main()
{
	while(scanf("%d",&k) && k)
	{
		memset(n , 0 , sizeof n);
		memset(f , 0 , sizeof f);
		for(re int i=1;i<=k;i++) n[i] = read();
		f[0][0][0][0][0] = 1;/*啥也不选的方案是1*/
		a[0] = 31;/*把a[0]设成超过范围的数,保证a[1]一定小于a[0]*/
		for(a[1]=0;a[1]<=n[1];a[1]++)
		 for(a[2]=0;a[2]<=n[2];a[2]++)
		  for(a[3]=0;a[3]<=n[3];a[3]++)
		   for(a[4]=0;a[4]<=n[4];a[4]++)
		    for(a[5]=0;a[5]<=n[5];a[5]++)
			{
				if(a[1] < n[1] && a[1] < a[0]) 
				f[a[1]+1][a[2]][a[3]][a[4]][a[5]]+=f[a[1]][a[2]][a[3]][a[4]][a[5]];
				if(a[2] < n[2] && a[2] < a[1]) 
				f[a[1]][a[2]+1][a[3]][a[4]][a[5]]+=f[a[1]][a[2]][a[3]][a[4]][a[5]];
				if(a[3] < n[3] && a[3] < a[2]) 
				f[a[1]][a[2]][a[3]+1][a[4]][a[5]]+=f[a[1]][a[2]][a[3]][a[4]][a[5]];
				if(a[4] < n[4] && a[4] < a[3]) 
				f[a[1]][a[2]][a[3]][a[4]+1][a[5]]+=f[a[1]][a[2]][a[3]][a[4]][a[5]];
				if(a[5] < n[5] && a[5] < a[4]) 
				f[a[1]][a[2]][a[3]][a[4]][a[5]+1]+=f[a[1]][a[2]][a[3]][a[4]][a[5]];
			}
		printf("%lld\n",f[n[1]][n[2]][n[3]][n[4]][n[5]]);
	}
	return 0;
}



标签:Picture,ch,int,题解,Permutations,long,getchar,DP,define
From: https://www.cnblogs.com/bloodstalk/p/17433061.html

相关文章

  • P8584 探索未知 题解
    题意给你\(n\)个分数,每个分数后面跟着一个操作符\(op\),如果为\(1\)就是加上这个分数,是\(2\)就减去。初始时是\(0\),询问\(n\)次操作后最后的分数是多少,化成最简分数。特殊地,如果最后是个整数,直接以整数的形式输出。思路模拟考试的时候一看就想到了[NOIP2020]......
  • P8587 新的家乡 题解
    题意给定\(n\)个高度分别为\(h_i\)的柱子,两个柱子能合并成一个\(h_i+h_j\)的新柱子,每根柱子至多被使用一次。询问最多能建出多少根高度相同的柱子,并且最优答案下柱子的高度有多少种情况。\(1\leqn\leq10^6\),\(1\leqh_i\leq3\times10^3\)。思路爆搜!首先我们......
  • P8585 球状精灵的传说 题解
    很好的一个题题意给你\(n\)个三元组\((r_1,r_2,r_3)\),并定义\(ρ=\lfloor\frac{1}{4}min(r_1,r_2,r_3)^3\rfloor\)。两个三元组能合并当且仅当这两个三元组有至少两个值相同,即从\((x_1,y,z)\)和\((x_2,y,z)\)变为\((x_1+x_2,y,z)\)。\((x,y,z)\)的位置不固定......
  • Android 修改 android/hardware/interfaces 下HIDL接口编译报异常问题解决
    最近要增加hostapd的一个HIDL接口,修改android/hardware/interfaces/wifi/hostapd/1.2/IHostapd.hal文件后编译报错如下:ERROR:[email protected]::IHostapdhashashacaed0a159a521bd4964e0fb8117320849109d3eeaff6a08b4d2506156ce6987whichdoesnotmatch......
  • P2480 古代猪文 题解
    题意:求\[g^{\sum_{k\midn}{n\choosek}}\]对\(999911659\)取模。\(1\len,g\le10^9\)。思路:首先根据欧拉定理,题目转化为求\(\displaystyle\sum_{k\midn}{n\choosek}\)对\(999911658\)取模的值。模数为合数不是很好做,因式分解发现\(999911658=2\times3\times467......
  • JOISC 2021 题解
    JOISC21フードコート(FoodCourt)首先我们发现我们这个删除实际上可以假删除,我们每次问询时求出这个队列目前被删了几个(维护区间加,区间\(\max(0,A-x)\))就可以把删除操作给弄掉了。然后我们考虑对商店做扫描线!因为我们现在其实就是对商店的单点问询,我们这个加入操作也可以在左......
  • 【题解】Codeforces Round 737 (CF1557)
    VP情况:solve:4/5rank:431st评价:VP了一下,我这个shaberB直接5发罚时,耽误了二十多分钟,以及被D各种细节差点搞死。A.EzzatandTwoSubsequences(*800)题目描述:给定一个序列,将其分为\(2\)个组,要求这两个组的平均值之和最大,组内的数不要求在原序列中连续。题目分析:我们......
  • 【题解】CF1062E Company
    传送门先考虑如何求解区间LCA假设要我们求\(8\sim11\)的LCA。那么显然它们的LCA等效于8和11的LCA。发现8和11刚好是“最左”和“最右”的两个顶点,感性理解一下,就可以得出一个结论:区间LCA和dfs序最小的和最大的的LCA是等效的。(这个结论应该还......
  • 题解(教主的魔法)P2801
    题目教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是$N$个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为$1,2,\ldots,N$。每个人的身高一开始都是不超过$1000$的正整数。教主的魔法每次可以把闭区......
  • 常见问题解决 --- 安卓中一个类中的匿名类和另一个类中的匿名类无法相互传值
      runOnUiThread(newRunnable(){@Overridepublicvoidrun(){//在UI线程中执行的主代码textView.setText("Hello,world!");}});将上面更新主ui放置在匿名内部类的回调方法里即可传值给属性。......