[关闭]
@Pinetrie 2019-02-24T12:00:52.000000Z 字数 1211 阅读 843

G - Lighting System Design UVA - 11400

题意

有n种灯,每种灯有相对应的额定电压v和电源价格k,每种灯需要l个,每个c元。为了节省钱,可以用高电压的灯代替低电压的灯。求最小花费。

题解

首先按电压排序,这样可以方便替换电灯。再预处理灯泡个数的前缀和。dp[i]表示从1到i种灯安装好最少的花费。转移方程为dp[i] = min(dp[i],dp[j - 1] + (pre[i] - pre[i - 1] * c + k)。表示当前j到i类的灯泡替换为第i类灯泡的花费,再不断更新答案。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,dp[1010],pre[1010];
  4. struct cate
  5. {
  6. int v,k,c,l;
  7. }cat[1010];
  8. bool cmp(struct cate x,struct cate y)
  9. {
  10. return x.v < y.v;
  11. }
  12. int main()
  13. {
  14. while(scanf("%d",&n) && n)
  15. {
  16. for(int i = 1;i <= n;i++) scanf("%d %d %d %d",&cat[i].v,&cat[i].k,&cat[i].c,&cat[i].l);
  17. sort(cat + 1,cat + 1 + n,cmp);
  18. pre[1] = cat[1].l;
  19. for(int i = 2;i <= n;i++) pre[i] = pre[i - 1] + cat[i].l;
  20. for(int i = 1;i <= n;i++)
  21. {
  22. dp[i] = 1e9;
  23. for(int j = 1;j <= i;j++)
  24. {
  25. dp[i] = min(dp[i],dp[j - 1] + (pre[i] - pre[j - 1]) * cat[i].c + cat[i].k);
  26. }
  27. }
  28. printf("%d\n",dp[n]);
  29. }
  30. return 0;
  31. }

H - Partitioning by Palindromes UVA - 11584

题意

求一个字符串种的最小回文串个数

题解

dp[i]表示前i个字符中的最小回文串个数。如果第i个字符加入后j到i组成回文串,那么更新答案dp[i] = min(dp[i],dp[j - 1] + 1)。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int T,dp[1010];
  4. char str[1010];
  5. bool ok(int l,int r)
  6. {
  7. for(int i = l;i <= r;i++)
  8. {
  9. if(str[i] != str[r - (i - l)]) return false;
  10. }
  11. return true;
  12. }
  13. int main()
  14. {
  15. scanf("%d",&T);
  16. while(T--)
  17. {
  18. scanf("%s",str);
  19. int n = strlen(str);
  20. for(int i = 0;i < n;i++)
  21. {
  22. dp[i] = dp[i - 1] + 1;
  23. for(int j = 0;j < i;j++)
  24. {
  25. if(ok(j,i)) dp[i] = min(dp[i],dp[j - 1] + 1);
  26. }
  27. }
  28. printf("%d\n",dp[n - 1]);
  29. }
  30. return 0;
  31. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注