第五部分 动态规划 (第四章 状压DP)例题

本文详细介绍了动态规划中的状压DP在解决实际问题中的应用,包括种植方案、最短路径、涂抹果酱和炮兵阵地四个例题。通过案例分析,阐述了如何设置状态、进行状态转移,并探讨了预处理在优化时间和空间复杂度上的重要作用。
摘要由CSDN通过智能技术生成

例题1:种植方案 link

在这里插入图片描述在这里插入图片描述

思路:
状压模板

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=100000000;
const int N=1e6;
int n, m, map[1<<13+10], a, f[20][1<<13+10], ans, tot, s[10010];
void dfs(int ans, int dep)
{
   
	if(dep > m) {
   s[++tot]=ans; return;}
	dfs(ans, dep+1);
	dfs(ans+(1 << (dep - 1)),dep+2);
}
int main()
{
   
	scanf("%d%d", &n, &m);
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
		{
   
			scanf("%d", &a);
			if(a==0) map[i]+=1 << (j - 1);
		}
	dfs(0,1);
	for(int i=1; i<=tot; i++)
		if(!(map[1] & s[i])) f[1][s[i]]=1;
	for(int i=2; i<=n; i++)
		for(int j=1; j<=tot; j++)
			if(!(map[i] & s[j]))
				for(int k=1; k<=tot; k++)
					if(!(s[j] & s[k]))
						f[i][s[j]]=(f[i][s[j]]+f[i-1][s[k]])%MAX;
	for(int i=1; i<=tot; i++) ans=(ans+f[n][s[i]])%MAX;
	printf("%d", ans%MAX);
	return 0; 
}

例题2:最短路径 link

在这里插入图片描述
在这里插入图片描述
思路:
设f[i][j]表示现在走到i点,所有点的遍历状态j(1表示走过,0反之亦然)
f [ i ] [ j ] = m i n ( f [ k ] [ j      x o r      ( 1 < < i ) ] + a [ i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值