BAPC 2014 Preliminary D

 题目链接: https://nanti.jisuanke.com/t/28204

//动态规划,重复利用子问题的最优,来求解当前最优问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
int t;
const int N=1600;
int s[N];
int dp[N];//在第i层下楼时从一楼到i楼共生气的最小值
const int inf=0x3f3f3f3f;
int main()
{
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
sum+=s[i];
}

dp[0]=0;

int ski;
for(int i=1;i<=n;i++)
{
sum-=s[i];//这一层下楼,那么此时前面的都会下,sum为高层人数。
ski=0;
dp[i]=inf;
for(int j=i-1;j>=0;j--)
{
dp[i]=min(dp[i],dp[j]+ski+sum);//
ski+=(i-j)*s[j];//该在j层下,却在i 层才下楼
}
}
//因为dp[i]为i层下楼的。。,因此用不下楼来更新
printf("%d\n",dp[n]);
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/tingtin/p/9279819.html
今日推荐