1、Codeforces 607B Zuma
解题思路:
dp[i][j] 表示消去区间 [i, j] 需要的时间
然后就是记忆化搜索了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <cctype>
#include <bitset>
#include <ctime>
using namespace std;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define lson low, mid, _id<<1
#define rson mid+1, high, _id<<1|1
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> Pair;
const ull mod = 1e9 + 7;
const int INF = 0x7fffffff;
const int maxn = 500 + 10;
int n;
int c[maxn], dp[maxn][maxn];
int dfs(int low, int high);
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &c[i]);
}
memset(dp, 0, sizeof(dp));
printf("%d\n", dfs(1, n));
return 0;
}
int dfs(int low, int high)
{
if (low > high) {
return 0;
}
if (dp[low][high]) {
return dp[low][high];
}
if (low == high) {
return 1;
}
if (low+1 == high) {
if (c[low] == c[high]) {
return 1;
} else {
return 2;
}
}
dp[low][high] = INF;
if (c[low] == c[high]) {
dp[low][high] = dfs(low+1, high-1);
}
for (int i = low; i <= high; ++i) {
dp[low][high] = min(dp[low][high], dfs(low, i) + dfs(i+1, high));
}
return dp[low][high];
}