P1985 [USACO07OPEN]翻转棋 Fliptile S

本题通过暴力枚举和递推思想解决,首先分析题目性质,每个点最多按一次,顺序不影响结果。枚举第一行的状态,根据上一行状态确定下一行,通过指数枚举求解所有可能,并找到最优解。字典序作为第二判断标准,从左到右、从上到下比较。注意避免定义变量类型错误导致的时间浪费。
摘要由CSDN通过智能技术生成

知识点:思维,枚举

这个题就是其实就是暴力,带思维的暴力,分析题目的性质,然后高效一点的暴力,具体的方法就是枚举第一行是否开关,然后下一行是否开关由上一行决定,这里就用到了指数枚举和递推的思想,最后统计一下,

为什么得出上述的算法,那是对题目的性质分析之后得出的,首先每个点最多只能按一次,按两次和不按是等效的,其次就是假如有一个答案方案,那么这个方案里面谁先谁后按都是一样的,这样可以启发我们,一行一行的按,所以就有了枚举第一行,然后一行一行的递推,那么产生的情况就已经包含最优解了,从这些所有的情况里面找出最优解就行了,这个题还有个第二标尺是字典序,这个就是从左到右,从上到下比较就行了,

中间有个小插曲,我想用flag表示3种情况的,结果没有定义成int,定义成了bool,这显然就是错的,bool只能表示两种状态,这个错误浪费了20多分钟时间,要不是可以20分钟过了这个题的,

#include <bits/stdc++.h>

using namespace std;

const int N = 20;

int n, m, a[N][N], b[N][N], d[N][N], ans;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
vector<int> chosen;

void solve(int k) {
	if (k == m + 1) {
		for (int i = 1; i <= n;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值