算法竞赛进阶指南,283页, 区间DP
本题要点:
1、原来的区间范围是 [1 ~ n], 因为是 环形,区间增大一倍,[1 ~ 2 * n]
2、转态表示:dp[L][R] 表示第 L堆石头到第R堆石头合并为一堆,需要消耗最小的的体力
3、转移方程:
dp[L][R] = min{dp[L][k] + dp[k + 1][R]}(k的范围 L <= k < R) + (a[L] + a[L + 1] + … + a[R])
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 210;//注意是环形的,开两倍的区间来模拟
int a[MaxN];
int dp[MaxN][MaxN]; //dp[L][R] 表示第 L堆石头到第R堆石头合并为一堆,需要消耗最小的的体力
int dp2[MaxN][MaxN]; //消耗最大的体力
int suma[MaxN]; //前缀和
int n;
void solve()
{
suma[0] =