当前位置: 代码迷 >> 综合 >> 紫书 例题 9-6 UVa 11400 (线性结构上的动态规划)
  详细解决方案

紫书 例题 9-6 UVa 11400 (线性结构上的动态规划)

热度:50   发布时间:2023-09-20 20:15:07.0

这道题的下标从1开始比较方便,一方面前缀和算的方便一些,一方面涉及到前j

个灯泡,那么如果从0开始,前3个灯泡就是第0, 1, 2, 3个,非常奇怪。

所以灵活换下标。

然后这道题的动规有点暴力枚举的意思,在算出前面答案的前提下枚举当前灯泡用多少去更新当前答案

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;const int MAXN = 1123;
struct node
{int v, k, c, l;bool operator < (const node& rhs) const{return v < rhs.v;}
}a[MAXN];
int n, s[MAXN], d[MAXN];int main()
{while(~scanf("%d", &n) && n){REP(i, 1, n + 1) scanf("%d%d%d%d", &a[i].v, &a[i].k, &a[i].c, &a[i].l);sort(a + 1, a + n + 1);REP(i, 1, n + 1) s[i] = s[i-1] + a[i].l;REP(i, 1, n + 1){d[i] = s[i] * a[i].c + a[i].k; //这里相当于初始化,不要漏, 不然答案是0 REP(j, 1, i + 1)d[i] = min(d[i], d[j] + (s[i] - s[j]) * a[i].c + a[i].k);}printf("%d\n", d[n]);}return 0;
}