/*
solution:
形如:E[j]=opt{D+w(i,j)}的dp
d[i]:选到种类i的时候所能花费的最少费用.
状态转移方程:
d[i] = (a[i] + 10) * p[i] + d[i-1];
d[i] = min(d[i], d[j] + (sum[i] - sum[j] + 10) * p[i]);
note:
wa的原因是状态转移方程出错,原本思路是枚举比i小的元素j,依次尝试用i来
代替j。但i可能用来代替多个种类的珍珠,所以正确姿势应该是枚举j,用i来代
替i~j内的所有种类珍珠。
date:
2016.8.19
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 101;
int c, a[maxn], p[maxn];
int d[maxn], sum[maxn];
int main()
{
//freopen("input.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%d", &c);
d[0] = 0;
for(int i = 1; i <= c; i++) {
scanf("%d%d", &a[i], &p[i]);
d[i] = (a[i] + 10) * p[i] + d[i-1];
sum[i] = sum[i-1] + a[i];
}
for(int i = 1; i <= c; i++) {
for(int j = 0; j < i; j++) { //j~i全部用种类i来代替
d[i] = min(d[i], d[j] + (sum[i] - sum[j] + 10) * p[i]);
}
}
printf("%d\n", d[c]);
}
return 0;
}
poj1260(形如E[j]=opt{D+w(i,j)}的dp)
最新推荐文章于 2018-02-08 10:09:00 发布