记忆化搜索 day48

本文介绍了记忆化搜索的概念,并通过解析SCOI2008的着色方案、IOI2009的葡萄干问题等题目,展示了记忆化搜索在解决动态规划问题中的应用。文章还探讨了记忆化搜索与动态规划的区别,并提供了实现思路。
摘要由CSDN通过智能技术生成

今天听完派队的教学

感觉又可以水几道紫题了

好耶✌

不过想起ygg提到的记忆化搜索

自己其实也是没有搞懂的

还是去做了几道题吧

 P2476 [SCOI2008]着色方案

紫题喵

最开始想的是一个这样的状态

f[i][j] 表示的是 第i块板子 前一块用的是编号为j的颜色

其实我们仔细想想就可以想出来 这个状态表示是有会漏情况的 比如1为头的时候

我们再搜3的时候 后面有的情况是有的 但是我们就直接返回了

后来被他们讲到 这就是有后效性 意会一下

一个可做的做法 

我们观察道c1 的数据范围奇小无比 并且抽象一下可以用ci的大小来划分成5种集合 

非常牛逼!

这样我们就可以写出状态转移方程:

f[c1​][c2​][c3​][c4​][c5​][last]=

[c_1 - (last == 2)] * f[c_1 - 1][c_2][c_3[c_4][c_5][1] +[c1​−(last==2)]∗f[c1​−1][c2​][c3​[c4​][c5​][1]+

[c_2 - (last == 3)] * f[c_1 + 1][c_2 - 1][c_3][c_4][c_5][2] +[c2​−(last==3)]∗f[c1​+1][c2​−1][c3​][c4​][c5​][2]+

[c_3 - (last == 4)] * f[c_1][c_2 + 1][c_3 - 1][c_4][c_5][3] +[c3​−(last==4)]∗f[c1​][c2​+1][c3​−1][c4​][c5​][3]+

[c_4 - (last == 5)] * f[c_1][c_2][c_3 + 1][c_4 - 1][c_5][4] +[c4​−(last==5)]∗f[c1​][c2​][c3​+1][c4​−1][c5​][4]+

c_5 * f[c_1][c_2][c_3][c_4 + 1][c_5 - 1][5]c5​∗f[c1​][c2​][c3​][c4​+1][c5​−1][5]

这样子确实是不重不漏的

我们可以这样子理解记忆化搜索:

我们就是在爆搜 但是加了一个不重不漏的集合 来优化

下面的dfs 也是很符合爆搜

就像是在枚举这一位到底填啥 让后根据填的啥规定系数

#include <bits/stdc++.h>
using namespace std;
const int N = 20;
const int M = 1<<16;
const int mod = 1e9+7;
#define int long long
#define LL long long
#define endl '\n'
#define Endl '\n'
#define _ 0
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int n,f[16][16][16][16][16][6],t[6];
int dfs(int a,int b,int c,int d,int e,int last){
    int &v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值