有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的,所有比它重量轻的都是苦的,比它重的都是酸的。为了要找出甜的苹果,就要去一个一个地吃它,且吃了咬了苹果就必须把它吃完,不管苹果是苦的还是酸的。
例如,先吃#1,
如果#1是甜的,花费1
如果#2是甜的,那么选择吃#3,不管#3是什么味道,都可以推测出#2和#4的味道,那么花费1+3
如果#3是甜的,第二次选择吃#3, 共花费1+3 = 4
如果#5是甜的,方案和上面一样, 共花费1+3 = 4
总共1+4+4+4 = 13,这方案更好。
给出n和k,问最少的吃的苹果总重量是多少?
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N= 503 ;
int n,m,f[N][N];
int dp(int l,int r){
if(l>r) return 0;
if(f[l][r]!=-1) return f[l][r];
if(l==r ) return f[l][r];
int t= 1e9;
for(int k=l;k<=r;k++)
t=min(t,dp()+f[k+1][r]+(k+m)*(r-l+1));
return f[l][r] =t;
}
signed main(){
int tes;cin>>tes;
int cas=0;
while(tes--){
cin>>n>>m;
memset(f,-1,sizeof f) ;
printf("Case %d: %d\n", ++cas,dp(1, n));
}
}
浙公网安备 33010602011771号