Processing math: 7%

[CF] E. Camels

CF 2000 的dp题目还是有点难qwq

题意:

一行有n个空位,每个空位可以填[1,4]的整数,要求:

1.有t个位置满足 ai−1<ai>ai+1(1<i<n)

2.有t−1个位置满足 ai−1>ai<ai+1

的方案总数

题解:

f[i][j][k][0/1] 表示 i位置 当前数是 j 已经有 k 个满足条件一的位置 上升/下降趋势

转移:

f[i][j][k][0]=\sum f[i-1][l][k][0] + f[i-1][l][k][1] (1<=l<j)

f[i][j][k][1]=\sum f[i-1][l][k][1] + f[i-1][l][k-1][0] (j<l<=n)

k = 0时说明还没有顶峰,第二个转移的后面这种情况就是0

Code

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
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<<3)+(x<<1)+(ch^48); ch=getchar(); }
	return x * f;
}
const int N = 27;
int n,t;
int f[N][N][N][2];	//f[i][j][k][0/1] 表示 i 位置,j高度,k个峰顶,上升/下降 
int main()
{
	n = read(), t = read();
	f[2][4][0][0] = 3;
	f[2][3][0][0] = 2;
	f[2][2][0][0] = 1;
	for(int i=3;i<=n;++i)
		for(int k=0;k<=t;++k)
			for(int j=1;j<=4;++j)
				for(int l=1;l<=4;++l) {
					if(l < j) f[i][j][k][0] += f[i-1][l][k][0] + f[i-1][l][k][1];	//增加了一个低谷,不改变k
					if(l > j) f[i][j][k][1] += f[i-1][l][k][1] + (k>0 ? f[i-1][l][k-1][0] : 0);
//					printf("i = %d %d\n",i,f[i][j][k][1]);
				}
	int ans = 0;
	for(int i=1;i<=4;++i)
		ans += f[n][i][t][1];
	printf("%d",ans);
	return 0;
}
posted @   基地AI  阅读(145)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· Supergateway:MCP服务器的远程调试与集成工具
· C# 13 中的新增功能实操
点击右上角即可分享
微信分享提示