题意:
看白书
要点:
其他的白书上讲的比较清楚了,状态转移方程为:d[i] = min(d[i], d[j] + (s[i] - s[j])*bulb[i].c + bulb[i].k),有点难以理解的是如果i到j之中有的不进行换比较合理怎么办?但其实这种情况是不存在的,这个博客进行了详细的数学推导:
#include#include #include #include #define inf 0x3f3f3f3fusing namespace std;int d[1005], s[1005];typedef struct node{ int v, k, c, l;}node;node bulb[1005];bool cmp(node a, node b){ return a.v < b.v;}int main(){ int n,i,j; while (scanf("%d", &n) && n) { for (i = 1; i <= n; i++) scanf("%d%d%d%d", &bulb[i].v,&bulb[i].k,&bulb[i].c,&bulb[i].l); sort(bulb + 1, bulb + 1 + n, cmp); memset(d, inf, sizeof(d)); memset(s, 0, sizeof(s)); d[0] = 0; for (i = 1; i <= n; i++) s[i] = s[i - 1] + bulb[i].l; for (i = 1; i <= n; i++) for (j = 0; j < i; j++) d[i] = min(d[i], d[j] + (s[i] - s[j])*bulb[i].c + bulb[i].k); printf("%d\n", d[n]); } return 0;}