• poj1179 Polygon


    思路:

    dp。

    实现:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <algorithm>
      4 #include <vector>
      5 using namespace std;
      6 
      7 const int INF = 0x3f3f3f3f;
      8 
      9 int n, a[55];
     10 char c[55];
     11 struct node
     12 {
     13     int minn, maxn;
     14 };
     15 node dp[55][55];
     16 struct ans
     17 {
     18     int res, index;
     19 };
     20 int cal(int a, int b, char c)
     21 {
     22     return c == 't' ? a + b : a * b;
     23 }
     24 int myMax(int a, int b, int c, int d)
     25 {
     26     return max(a, max(b, max(c, d)));
     27 }
     28 int myMin(int a, int b, int c, int d)
     29 {
     30     return min(a, min(b, min(c, d)));
     31 }
     32 int main()
     33 {
     34     cin >> n;
     35     for (int i = 0; i < n; i++)
     36     {
     37         cin >> c[i] >> a[i];
     38     }
     39     vector<ans> Ans;
     40     for (int t = 0; t < n; t++)
     41     {
     42         for (int i = 0; i < n; i++)
     43         {
     44             for (int j = i; j < n; j++)
     45             {
     46                 dp[i][j].minn = INF;
     47                 dp[i][j].maxn = -INF;
     48             }
     49         }
     50         vector<int> x;
     51         vector<char> y;
     52         for (int j = t; j < n; j++)
     53         {
     54             x.push_back(a[j]);
     55             if (j != t)
     56                 y.push_back(c[j]);
     57         }
     58         for (int j = 0; j < t; j++)
     59         {
     60             x.push_back(a[j]);
     61             y.push_back(c[j]);
     62         }
     63         for (int i = n - 1; i >= 0; i--)
     64         {
     65             for (int j = i; j < n; j++)
     66             {
     67                 if (j == i)
     68                     dp[i][j].minn = dp[i][j].maxn = x[i];
     69                 if (j == i + 1)
     70                 {
     71                     dp[i][j].maxn = dp[i][j].minn = cal(x[i], x[j], y[i]);
     72                 }
     73                 else
     74                 {
     75                     for (int k = i; k < j; k++)
     76                     {
     77                         node l = dp[i][k], r = dp[k + 1][j];
     78                         if (y[k] == 't')
     79                         {
     80                             dp[i][j].minn = min(dp[i][j].minn, cal(l.minn, r.minn, 't'));
     81                             dp[i][j].maxn = max(dp[i][j].maxn, cal(l.maxn, r.maxn, 't'));
     82                         }
     83                         else
     84                         {
     85                             dp[i][j].minn = min(dp[i][j].minn, 
     86                                                 myMin(cal(l.minn, r.minn, 'x'), 
     87                                                       cal(l.minn, r.maxn, 'x'), 
     88                                                       cal(l.maxn, r.minn, 'x'),
     89                                                       cal(l.maxn, r.maxn, 'x')));
     90                             dp[i][j].maxn = max(dp[i][j].maxn, 
     91                                                 myMax(cal(l.minn, r.minn, 'x'),
     92                                                       cal(l.minn, r.maxn, 'x'), 
     93                                                       cal(l.maxn, r.minn, 'x'), 
     94                                                       cal(l.maxn, r.maxn, 'x')));
     95                         }
     96                     }
     97                 }
     98             }
     99         }
    100         ans as;
    101         as.res = dp[0][n - 1].maxn;
    102         as.index = t + 1;
    103         Ans.push_back(as);
    104     }
    105     int maxn = -INF, maxIndex = -1;
    106     for (int i = 0; i < n; i++)
    107     {
    108         if (Ans[i].res > maxn)
    109         {
    110             maxn = Ans[i].res;
    111             maxIndex = Ans[i].index;
    112         }
    113     }
    114     vector<int> p;
    115     for (int i = 0; i < n; i++)
    116     {
    117         if (Ans[i].res == maxn)
    118         {
    119             p.push_back(Ans[i].index);
    120         }
    121     }
    122     cout << maxn << endl;
    123     for (int i = 0; i < p.size(); i++)
    124     {
    125         cout << p[i] << " ";
    126     }
    127     cout << endl;
    128     return 0;
    129 }
  • 相关阅读:
    java常用类及第三方开源库-资料汇总
    java动态追踪技术研究-美团技术中心
    MPP架构是什么?看这一篇就行了。。
    大数据基础-数据存储组件介绍
    Scrum团队从创建到成熟的四个阶段
    k8s基础知识-备忘总结
    Kafka基础知识总结笔记
    DDD学习大纲
    HBase资料汇总
    R-CNN系列(3)—— Fast R-CNN
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6381268.html
Copyright © 2020-2023  润新知