题目大意:有 n 个人,每个人有一个diaosi[i]值,如果第 i 个人排在第 k 位置,则他的愤怒值就为diaosi[i]*(k-1);
等待过程中有一个黑屋子,可以把人暂时放到黑屋子里。使总的愤怒值最小;
输入要求:T组数据,n个人,每个人的愤怒值
输出要求:Case #2: 最小愤怒值
思路引导:这是一道区间dp题。我们用dp[i][j]表示第i个人到第j个人unhappiness总和的最小值,因此dp[1][n]就是我们所要求的的值。怎么求呢?这种题肯定是转换成一些子问题,不断地的递推求解。我们来考虑第i个人的情况,在区间[i,j]中,第i个人可能是第一个走的,也可能是第j-i+1 个走的,所以假设第i个人是第k个走的,根据题目有第i 个人的这里写代码片unhappiness值为(k-1)D[i].那么从i+1 开始的k-1个人都是在i 之前走的,此时就会出现一个子问题——dp[i+1][i+1+k-1+1].这个区间的人都是已经走过的,那么在[i,j] 区间里,从i+k到j 都是还没有走的,那么他们就要继续等待,把它们看成一个整体,即unhappyiness 值为k(sum[j]-sum[i+k-1]).这里写图片描述
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath