本题是一道明显的动态规划的题目,分析:我们知道,假设有一本书,那么肯定搬这一次,就是最优情况,如果有两本书,那么要么搬两次,要么搬一次,所以取中间最优的情况,所以,取dp[i]为要搬I本书所需要的最少体力值,循环从1-n本书,然后j从1->i即可,取最小值,代码如下:
/*
@author:HaiRu,WU
@from:AHUT
*/
#include<iostream>
using namespace std;
const int max_n=60000;
int main(){
int n;
int a[max_n];
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
int dp[max_n];
//边界
dp[1]=a[1];
//状态转移
for(int i=2;i<=n;i++){
int Min=a[i];
for(int j=1;j<i;j++){
Min=min(Min,dp[j]+dp[i-j]);
}
dp[i]=Min;
}
cout<<dp[n]<<endl;
return 0;
}