题意:
给一个集合,最开始只有一个正整数N。。
求最少使用多少轮可以把集合变成空集(数字变成0则从集合消去)
each turn, 对集合中每个数可以进行两个操作:
1) 分成两个(不能分出0)
2)减一
思路:
记忆化搜索
边界:f(n, 0) = n
class CartInSupermarketEasy
{
public:
int dp(int n, int k) {
if (n < 4) return n;
if (f[n][k] == -1) {
f[n][k] = f[n][0];
rep(i, 1, n/2)
rep(j, 0, k-1)
f[n][k] = min(f[n][k],
max(dp(i, j), dp(n-i, k-1-j))+1);
}
return f[n][k];
}
int calc(int N, int K)
{
memset(f, -1, sizeof(f));
rep(i, 0, Maxn) f[i][0] = i;
return dp(N, K);
}
};