今天听完派队的教学
感觉又可以水几道紫题了
好耶✌
不过想起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