• 283. 多边形,《算法竞赛进阶指南》,


    283. 多边形 - AcWing题库

    多边形游戏”是一款单人益智游戏。

    游戏开始时,给定玩家一个具有 N 个顶点 N 条边(编号 1∼N)的多边形,如图 1 所示,其中 N=4

    每个顶点上写有一个整数,每个边上标有一个运算符 +(加号)或运算符 *(乘号)。

    1179_1.jpg

    第一步,玩家选择一条边,将它删除。

    接下来在进行 N−1 步,在每一步中,玩家选择一条边,把这条边以及该边连接的两个顶点用一个新的顶点代替,新顶点上的整数值等于删去的两个顶点上的数按照删去的边上标有的符号进行计算得到的结果。

    下面是用图 1 给出的四边形进行游戏的全过程。

    1179_2.jpg

    最终,游戏仅剩一个顶点,顶点上的数值就是玩家的得分,上图玩家得分为 0。

    请计算对于给定的 N 边形,玩家最高能获得多少分,以及第一步有哪些策略可以使玩家获得最高得分。

    输入格式

    输入包含两行,第一行为整数 N。

    第二行用来描述多边形所有边上的符号以及所有顶点上的整数,从编号为 1 的边开始,边、点、边…按顺序描述。

    其中描述顶点即为输入顶点上的整数,描述边即为输入边上的符号,其中加号用 t 表示,乘号用 x 表示。

    输出格式

    输出包含两行,第一行输出最高分数。

    在第二行,将满足得到最高分数的情况下,所有的可以在第一步删除的边的编号从小到大输出,数据之间用空格隔开。

    数据范围

    3≤N≤50
    数据保证无论玩家如何操作,顶点上的数值均在 [−32768,32767]之内。

    输入样例:
    1. 4
    2. t -7 t 4 x 2 x 5
    输出样例:
    1. 33
    2. 1 2

    解析:
    简单题,注意细节

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. using namespace std;
    16. typedef long long LL;
    17. const int N = 110,INF=1e8;
    18. int n;
    19. char c[N];
    20. int a[N];
    21. int f[N][N], g[N][N];
    22. int main() {
    23. cin >> n;
    24. for (int i = 1; i <= n; i++) {
    25. cin >> c[i] >> a[i];
    26. a[i + n] = a[i];
    27. c[i + n] = c[i];
    28. }
    29. for (int len = 1; len <= n; len++) {
    30. for (int i = 1; i + len - 1 <= 2 * n; i++) {
    31. int j = i + len - 1;
    32. if (len == 1) {
    33. f[i][j] = a[i];
    34. g[i][j] = a[i];
    35. }
    36. else {
    37. f[i][j] = -INF, g[i][j] = INF;
    38. for (int k = i; k < j; k++) {
    39. int minl = g[i][k], minr = g[k + 1][j], maxl = f[i][k], maxr = f[k + 1][j];
    40. if (c[k + 1] == 't') {
    41. f[i][j] = max(f[i][j], maxl+maxr);
    42. g[i][j] = min(g[i][j], minl + minr);
    43. }
    44. else {
    45. int x1 = minl * minr, x2 = minl * maxr, x3 = maxl * minr, x4 = maxl * maxr;
    46. f[i][j] = max(f[i][j], max(max(x1, x2), max(x3, x4)));
    47. g[i][j] = min(g[i][j], min(min(x1, x2), min(x3, x4)));
    48. }
    49. }
    50. }
    51. }
    52. }
    53. int ans = -INF;
    54. for (int i = 1; i <= n; i++) {
    55. ans = max(ans, f[i][i + n - 1]);
    56. }
    57. cout << ans << endl;
    58. for (int i = 1; i <= n; i++) {
    59. if (ans == f[i][i + n - 1]) {
    60. cout << i << " ";
    61. }
    62. }
    63. cout << endl;
    64. return 0;
    65. }

  • 相关阅读:
    由于找不到msvcp140_1.dll无法继续执行代码怎么解决
    JNI相关总结
    “自主可控”的正确姿势—自主可控交换机的机遇与挑战
    UEFI-PciHostBridge
    数据结构——排序(C语言实现)
    深圳市商务局2022年电子商务创新发展扶持计划跨境电商通关监管场所服务奖励项目申报指南
    有哪些有睡后收入的副业?
    C++学习第六课--string类型操作笔记
    写作软件评测iA Writer、Ulysses、Effie、Typora、Writeathon、Bear
    GaiaX开源解读 | 跨端动态化模板引擎详解,看完你也能写一个
  • 原文地址:https://blog.csdn.net/Landing_on_Mars/article/details/133465894