【搜索】JZOJ_1764 游戏

题意

一个完整的倒三角有 n n n层,第一层有 n n n个数字,为原始数字,接下来每层都比上一层减少 1 1 1个数字,并有 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],和一个限制 m a x ( 0 &lt; = f [ 1 , i ] &lt; = m a x ) 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]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值