POJ1179 Polygon(区间dp)

蔚落 2021-11-29 14:56 459阅读 0赞

题意:多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号,游戏第1步,将一条边删除,随后n-1步按以下方式操作 (1)选择一条边E以及由E连接着的2个顶点V1和V2 (2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点 最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。

分析:《算法竞赛进阶指南》P284-286。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. using namespace std;
  6. const int M = 60;
  7. int n,a[2*M],f[2*M][2*M],f1[2*M][2*M];
  8. char b[2*M];
  9. int main()
  10. {
  11. memset(f,-0x3f,sizeof f);
  12. memset(f1,0x3f,sizeof f1);
  13. scanf("%d",&n);
  14. for(int i = 1; i <= n; i++)
  15. getchar(),scanf("%c%d",&b[i],&a[i]),b[i+n] = b[i],a[i+n] = a[i];
  16. for(int i = 1; i <= 2*n;i ++) f1[i][i] = f[i][i] = a[i];
  17. for(int j = 2; j <= n;j++)
  18. for(int k = 1; j + k - 1 <= 2 * n; k++)
  19. for(int l = k+1;l <= j + k - 1; l++)
  20. {
  21. if(b[l] == 't')
  22. {
  23. f[k][j+k-1] = max(f[k][j+k-1],f[k][l-1] + f[l][j+k-1]);
  24. f1[k][j+k-1] = min(f1[k][j+k-1],f1[k][l-1] + f1[l][j+k-1]);
  25. }
  26. else
  27. {
  28. f[k][j+k-1] = max(f[k][j+k-1],f[k][l-1] * f[l][j+k-1]);
  29. f[k][j+k-1] = max(f[k][j+k-1],f1[k][l-1] * f1[l][j+k-1]);
  30. f1[k][j+k-1] = min(f1[k][j+k-1],f1[k][l-1] * f1[l][j+k-1]);
  31. f1[k][j+k-1] = min(f1[k][j+k-1],f1[k][l-1] * f[l][j+k-1]);
  32. f1[k][j+k-1] = min(f1[k][j+k-1],f[k][l-1] * f1[l][j+k-1]);
  33. f1[k][j+k-1] = min(f1[k][j+k-1],f[k][l-1] * f[l][j+k-1]);
  34. }
  35. }
  36. int maxx = -0x7fffffff;
  37. for(int i = 1; i <= n; i++)
  38. maxx = max(maxx,f[i][i+n-1]);
  39. printf("%d\n", maxx);
  40. for(int i = 1; i <= n; i++)
  41. if(f[i][i+n-1] == maxx)
  42. printf("%d ",i);
  43. return 0;
  44. }

发表评论

表情:
评论列表 (有 0 条评论,459人围观)

还没有评论,来说两句吧...

相关阅读

    相关 poj 2253(区间DP

    [原题][Link 1] 思路:求所有路径中最大跳跃距离的最小值, 很诡异的是输出答案如果用G++,.3lf%格式会出错,c++可以过 include<cstdio

    相关 POJ1179 Polygon区间dp

    题意:多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“\”。所有边依次用整数从1到n编号,游戏第1