D. Lift Problems(动态规划)
借鉴:
https://blog.youkuaiyun.com/Wood_Du/article/details/80968277
1000 ms
- 262144k
在一座大型大学大楼的底层(零层),许多学生在等电梯。通常,电梯停在一个或多个学生需要下车的每一层楼,但对于想要在较高楼层下车的学生来说,这是很烦人的。或者,电梯可以跳过几层楼,但对于那些想在其中一层楼下车的学生来说,这是很烦人的。
具体来说,如果电梯还没有到达他或她想要下车的楼层,那么在电梯停下来的每一层,学生都会感到恼火。如果电梯跳过学生想要下车的楼层,他或她就会在那层和每一层都感到烦恼,直到(不包括)电梯下一站的地板,学生终于可以出来走下楼梯,回到自己的目的地。例如,如果一个学生想在第五层下车。当电梯停在二楼、七楼和十楼时,学生会在二楼、五楼和六楼感到厌烦。总之,这位学生在三层楼会感到烦恼。
进入电梯后,每个学生都按下与他或她想要去的楼层相对应的按钮,即使它已经被别人按下了。控制电梯的CPU可以准确地知道每个楼层有多少学生想要下车。
您的任务是编程CPU,以决定在哪一层停止。我们的目标是最大限度地减少所有学生的愤怒情绪:也就是每个学生被激怒的楼层数,为所有学生加在一起。
你可以忽略所有可能(想)进入电梯的人在任何较高的楼层。电梯必须以这样的方式操作:每一个在一楼等候的学生都可以到她或他想要去的楼层,要么从那层楼出来,要么走下楼梯。
输入格式
在第一行中有一个阳性数字:测试用例的数量,最多为100个。在此之后,每个测试用例:
- 一个整数的一行nn (1列克n\leq 1 5001≤n≤1500):建筑物的楼层数,不包括底层。
- 带n个空分隔整数的一行S_isi (0\leq s_i\leq 1 5000≤si≤1500):每层楼ii,学生人数S_isi想出去的人。
输出格式
每个测试用例:
- 一行有一个整数:最小的总数量的提升愤怒。
样例输入
3
5
0 3 0 0 7
5
0 0 3 0 7
10
3 1 4 1 5 9 2 6 5 3
样例输出
7
6
67
题目来源
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define maxn 1600
#define inf 0x3f3f3f3f
int T;
int n,s[maxn];
int dp[maxn];// 从一楼到i楼可以下楼情况时生气的最小值,每层楼都可以停留,所以之间的点都要算,因为是动态规划,所以每次只要算端点和其他任意点就行了。
//
using namespace std
int main()
{
cin>>T;
int i,j,k;
while(T--)
{
cin>>n;
int sum=0;
for(i=1;i<=n;i++)
{
cin>>s[i];
sum+=s[i]; //sum为高层人数
}
dp[0]=0;
for(i=1;i<=n;i++)
{
sum-=s[i]; //i以前的都会下,sum为i以上的,持续减小。
k=0;
dp[i]=inf;
for(j=i-1;j>=0;j--)
{
dp[i]=min(dp[i],dp[j]+k+sum); //dp[0]只是一个过渡变量,并没有dp本身的性质。dp[0]算的是在自身停的情况,也就是最后才算自身
k=k+(i-j)*s[j]; //每次往下推一层就要在加上
}
}
cout<<dp[n]<<endl;
}
return 0;
}
1000 ms
262144K
在一座大型大学大楼的底层(零层),许多学生在等电梯。通常,电梯停在一个或多个学生需要下车的每一层楼,但对于想要在较高楼层下车的学生来说,这是很烦人的。或者,电梯可以跳过几层楼,但对于那些想在其中一层楼下车的学生来说,这是很烦人的。
具体来说,如果电梯还没有到达他或她想要下车的楼层,那么在电梯停下来的每一层,学生都会感到恼火。如果电梯跳过学生想要下车的楼层,他或她就会在那层和每一层都感到烦恼,直到(不包括)电梯下一站的地板,学生终于可以出来走下楼梯,回到自己的目的地。例如,如果一个学生想在第五层下车。当电梯停在二楼、七楼和十楼时,学生会在二楼、五楼和六楼感到厌烦。总之,这位学生在三层楼会感到烦恼。
进入电梯后,每个学生都按下与他或她想要去的楼层相对应的按钮,即使它已经被别人按下了。控制电梯的CPU可以准确地知道每个楼层有多少学生想要下车。
您的任务是编程CPU,以决定在哪一层停止。我们的目标是最大限度地减少所有学生的愤怒情绪:也就是每个学生被激怒的楼层数,为所有学生加在一起。
你可以忽略所有可能(想)进入电梯的人在任何较高的楼层。电梯必须以这样的方式操作:每一个在一楼等候的学生都可以到她或他想要去的楼层,要么从那层楼出来,要么走下楼梯。
输入格式
在第一行中有一个阳性数字:测试用例的数量,最多为100个。在此之后,每个测试用例:
- 一个整数的一行nn (1列克n\leq 1 5001≤n≤1500):建筑物的楼层数,不包括底层。
- 带n个空分隔整数的一行S_isi (0\leq s_i\leq 1 5000≤si≤1500):每层楼ii,学生人数S_isi想出去的人。
输出格式
每个测试用例:
- 一行有一个整数:最小的总数量的提升愤怒。
样例输入
3
5
0 3 0 0 7
5
0 0 3 0 7
10
3 1 4 1 5 9 2 6 5 3
样例输出
7
6
67
题目来源