题意:给N个苹果,重量为 K+1, K+2, K+3,......K+N。
苹果中有1个甜的,其他比这个重的都是酸的,比这个轻的都是苦的。让求甜的分别为#1, #2, 。。。。 #N 号苹果时,要品尝的苹果的重量最少为多少。
这里用dp[i][j]表示【i,j】区间的苹果的最小值,那么可以的到一个dp公式:dp[i][j]= dp[i][k-1]+dp[k+1][j]+len*(k+K),区间dp即可。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int dp[510][510];
const int INF=1e9;
int main()
{
int T, N, K;
cin>>T;
int cnt=1;
while(T--)
{
cin>>N>>K;
memset(dp, 0, sizeof(dp));
for(int len=1; len<=N; len++) //区间长度
{
for(int i=K+1; i<=K+N; i++) // 【i,i+len】
{
if(i+len>K+N)
continue;
dp[i][i+len]=INF;
for(int j=i; j<=i+len; j++)
{
int temp=dp[i][j-1]+dp[j+1][i+len]+j*(len+1);
// 这里 j*(len+1)
// j 即为苹果重量, (len+1)是苹果个数
dp[i][i+len]=min(dp[i][i+len], temp);
}
}
}
cout<<"Case "<<cnt++<<": "<<dp[K+1][N+K]<<endl;
}
return 0;
}