问题
问题是给四个糖果堆(高度为n,n<=40),每次可以从任意一个堆的顶部取一个糖果放在容量为5的篮子中,若篮子中有两个颜色相同,就可以拿走,求最多可以拿走多少个糖果对
分析
状态是dp[a][b][c][d],a,b,c,d分别是从四个堆中拿走的的糖果个数,dp[0][0][0][0]是还没取的时候,可以得到的最多糖果对数量,dp[a][b][c][d]是已经取了a,b,c,d的时候还能够继续拿到的最大糖果数量
本题的思路有点类似于上一题(最长路),不过状态维度稍微多了点,有一点要注意的:不用加入篮子里的糖果数量作为一个维度,而是直接把它计算出来
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=42;
int piles[4][maxn],n,dp[maxn][maxn][maxn][maxn],cnt[21],kase=1;
int DFS(int *num,int bas){
int