HDU 4283 You Are the One
Posted LJZ_C
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4283 You Are the One相关的知识,希望对你有一定的参考价值。
有n个人排队,对于每个人有个不同的D,如果他是第k个排到的,会有(k-1)*D的不满,你可以将当前队首放入一个栈中并在任意时刻让栈顶元素出栈问最小的不满值
状态有两种转移,让队首直接出队或让他在入栈并在第i个人后出栈
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int inf = 1000000000;
int T, N, D[105];
int f[105][105][105];
int DP(int l, int r, int k) {
if(l == r) return k * D[l];
int & res = f[l][r][k];
if(res != -1) return res;
res = inf;
res = min(res, DP(l + 1, r, k + 1) + k * D[l]);
for(int i = l + 1; i < r; i++) {
int _k = k + i - l;
res = min(res, DP(l + 1, i, k) + _k * D[l]
+ DP(i + 1, r, _k + 1));
}
res = min(res, DP(l + 1, r, k) + (k + r - l) * D[l]);
return res;
}
int main() {
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++) {
scanf("%d", &N);
for(int i = 1; i <= N; i++) scanf("%d", &D[i]);
memset(f, -1, sizeof(f));
printf("Case #%d: %d\n", kase, DP(1, N, 0));
}
return 0;
}
以上是关于HDU 4283 You Are the One的主要内容,如果未能解决你的问题,请参考以下文章
HDU 4283---You Are the One(区间DP)
刷题总结——you are the one(hdu4283)