【搜索】JZOJ_1764 游戏

博客围绕倒三角数字序列问题展开,该序列每层数字递减且满足特定运算规则,还存在坏点。给出f[n,1]和限制max,要求找出字典序最小的f[1]序列。解题思路是发现f[1]序列系数类似杨辉三角,先求系数再进行搜索,并给出了代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

一个完整的倒三角有nnn层,第一层有nnn个数字,为原始数字,接下来每层都比上一层减少111个数字,并有f[i,j]=f[i−1,j]+f[i−1,j+1]f[i,j]=f[i-1,j]+f[i-1,j+1]f[i,j]=f[i1,j]+f[i1,j+1],如
  3  1  2  4
    4  3  6
     7  9
      16
给出f[n,1]f[n,1]f[n,1],和一个限制max(0&lt;=f[1,i]&lt;=max)max(0&lt;=f[1,i]&lt;=max)max0<=f[1,i]<=max,求出字典序最小的f[1]f[1]f[1]序列。

因为太过简单,添加了一些坏点,以坐标的形式给出,所谓坏点就是f[i,j]f[i,j]f[i,j]恒为0。

思路

可以发现f[1]f[1]f[1]的序列中的系数类似杨辉三角,所以可以先求出系数,再进行搜索即可。

代码

#include<cstdio>
#include<algorithm>

int n, m, maxn, f, va;
int g[101][101], ans[101];

void dfs(int dep, int sum) {
	if (va || sum > f) return;
	if (dep > n) {
		if (sum == f)
			va = 1;
		return;
	}
	if (!g[n][dep]) dfs(dep + 1, sum);
	else
	for (int i = 0; i <= std::min((f - sum) / g[n][dep], maxn); i++) {
		ans[dep] = i;
		dfs(dep + 1, sum + g[n][dep] * i);
		if (va) return;
	}
}

int main() {
	scanf("%d %d %d %d", &n, &m, &maxn, &f);
	g[0][0] = 1;
	for (int i = 1; i <= m; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		x = n - x + 1;
		g[x][y] = -1;
	}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= i; j++)
			if (g[i][j]) g[i][j] = 0;
			else g[i][j] = g[i - 1][j - 1] + g[i - 1][j];
	dfs(1, 0);
	if (!va) printf("-1");
	else for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值