题目的意思是:
有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D。但是边上有一个小黑屋(栈),可以一定程度上调整上场程序,使得不开心值最小
学习一下区间dp的问题
dp[i][j]: 表示区间[i,j]的不开心值最小。
当前只考虑这一段区间里面的人的话,也就是这j-i+1个人出栈的名次是[1,j-i+1], 那么假设第i个人是第k个出栈的话,那么[i+1,i+k-1]的人肯定是在第i个人出栈之前就出栈了,然后[i+k,j]的人都是在第i个人出栈之后才出栈的。这两个新的区间就成为了新的子问题。
所以 dp[i][j] = min ( dp[i][j] , dp[i+1][i+k-1] + dp[i+k][j] + (k-1) * a[i] +(k+1-1)*(sum[j] - sum[i+k-1]));
sum是前缀和。因为在第i个人后面的出栈的人名次最少也是偏移k+1次,提前计算着段偏移值,使得后来计算这个区间的时候,仍然可以从一到区间长度的名次出栈,就是原问题的子问题了
#include<cstdio>