J - Pangu and Stones (区间dp)

J - Pangu and Stones

 

1、思路:

dp[i][j][k]表示区间[i,j]内分为k段区间需要合并的最小代价。

因为dp[i][i][1] = 0;

可以在此基础上递推得到区间长度为2的情况,

dp[i][j][k] = min{ dp[i][j][k] , dp[i][p][k-1]+dp[p+1][j][1] } (1<=k<=min(R,len), i+k-2<= p

然后求出这段区间上的合并所需的最小的石子的数量,

dp[i][j][1] = min{ dp[i][j][1] , dp[i][p][k-1]+dp[p+1][j][1]+pre[j]-pre[i-1] };

求出这段区间上的最少石子的数量。

(参考文章)

 

2、代码:

#include
#include
#include
#include
using namespace std;
const int maxn = 120;
const int INF = 1e9+10;
int dp[maxn][maxn][maxn],n,L,R,a[maxn],pre[maxn];
void Init(){
	for(int i=0;i

 

你可能感兴趣的:(dp)