【USACO 2006 November Gold】Corn Fields

这篇博客详细介绍了如何解决USACO 2006年11月黄金组的Corn Fields问题,采用的是状态压缩动态规划(DP)的算法来求解。博主分享了完整的解题思路和代码实现。

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

【题目链接】

          点击打开链接

【算法】

         状压DP

【代码】

    

#include<bits/stdc++.h>
using namespace std;
#define MAXN 12
#define MOD 100000000

int M,N,i,j,k,ans,state;
int ST[MAXN+1][(1<<12)+1],f[MAXN+1][(1<<12)+1],cnt[MAXN+1],mat[MAXN+1][MAXN+1];

template <typename T> inline void read(T &x) {
	int f = 1; x = 0;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
template <typename T> inline void write(T x) {
	if (x < 0) { putchar('-'); x = -x; }
	if (x > 9) write(x/10);
	putchar(x%10+'0');	
}
template <typename T> inline void writeln(T x) {
	write(x);
	puts("");	
}

inline void dfs(int dep) {
	if (dep > N) ST[i][++cnt[i]] = state;
	else {
		dfs(dep+1);
		if (mat[i][dep]) {
			if ((dep == 1) || (!(state & (1 << (N - dep + 1))))) {
				state |= (1 << (N - dep));
				dfs(dep+1);
				state &= (~(1 << (N - dep)));
			}
		}
	}
}

int main() {
	
	read(M); read(N);
	
	for (i = 1; i <= M; i++) {
		for (j = 1; j <= N; j++) {
			read(mat[i][j]); 
		} 
	}	
	
	for (i = 1; i <= M; i++) dfs(1);
	
	for (i = 1; i <= cnt[1]; i++) f[1][i] = 1;
	for (i = 2; i <= M; i++) {
		for (j = 1; j <= cnt[i]; j++) {
			for (k = 1; k <= cnt[i-1]; k++) {
				if (!(ST[i][j] & ST[i-1][k]))
					f[i][j] = (f[i][j] + f[i-1][k]) % MOD;
			}
		}	
	}
	
	for (i = 1; i <= cnt[M]; i++) ans = (ans + f[M][i]) % MOD;
	writeln(ans);
	
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值