乌龟棋
题目大意:
给你n个格子(每个格子都有一个分数),m张卡片,从1号格子移动到n号格子,每次移动的步数只能是卡片的数值,每张卡片只能用一次;
卡片的种类数小于等于4;
看上去毫无头绪,但是要抓住重点,卡片种类数小于等于4;再结合数据范围,可以想到是否要一个四维的数组来定义状态呢;
没错,dp[i][j][k][l] 表示第一种卡片用了 i 张,第二种卡片用了 j 张,第三种卡片用了 k 张,第四种卡片用了 l 张的最大值;
那么转移方程也就十分简单了;
代码:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=50;
const int M=50100;
const LL mod=1e9+7;
int n,m,a[400],sum[5],dp[N][N][N][N];
int main(){
cin>>n