动态规划

记录点滴。

  1 /*
  2 2015.6    HT
  3 ACM Work_5
  4 
  5 */
  6 
  7 #include <iostream>
  8 #include <algorithm>
  9 using namespace std;
 10 
 11 /*
 12 数塔
 13 要求从顶层走到底层,若每一步只能走到相邻的结点
 14 采用自底向上方法,当前层的数的值由下一层的两个数的值决定
 15 Input:
 16 1
 17 5
 18 7
 19 3 8
 20 8 1 0
 21 2 7 4 4
 22 4 5 2 6 5
 23 Output:
 24 30
 25 */
 26 //int main()
 27 //{
 28 //    int t, n, x[102][102];
 29 //    cin >> t;
 30 //    while (t--)
 31 //    {
 32 //        cin >> n;
 33 //        for (int i = 0; i<n; i++)
 34 //        for (int j = 0; j <= i; j++)
 35 //            cin >> x[i][j];
 36 //        for (int i = n - 2; i >= 0; i--)
 37 //        for (int j = 0; j <= i; j++)
 38 //            x[i][j] = x[i][j] + max(x[i + 1][j], x[i + 1][j + 1]);
 39 //
 40 //        cout << x[0][0] << endl;
 41 //    }
 42 //    return 0;
 43 //}
 44 
 45 
 46 
 47 /*
 48 免费馅饼
 49 0-1-2-3-4-5-6-7-8-9-10
 50 */
 51 //int c[1000][11];
 52 //
 53 //int max1(int a, int b, int c)
 54 //{
 55 //    a = a>b ? a : b;
 56 //    a = a>c ? a : c;
 57 //    return a;
 58 //}
 59 //
 60 //int main()
 61 //{
 62 //    int n, a, b;
 63 //    while (cin >> n && n)
 64 //    {
 65 //        int m = 0;
 66 //        memset(c, 0, sizeof(c));
 67 //        while (n--)
 68 //        {
 69 //            // 坐标点        落下时刻
 70 //            scanf_s("%d%d", &a, &b);
 71 //            c[b][a]++;
 72 //            if (m < b)
 73 //                m = b;
 74 //        }
 75 //        for (int i = m - 1; i >= 0; i--)
 76 //        {
 77 //            for (int j = 1; j <= 9; j++)
 78 //                c[i][j] = c[i][j] + max1(c[i + 1][j - 1], c[i + 1][j], c[i + 1][j + 1]);
 79 //            c[i][0] = c[i][0] + max(c[i + 1][0], c[i + 1][1]);
 80 //            c[i][10] = c[i][10] + max(c[i + 1][9], c[i + 1][10]);
 81 //        }
 82 //        cout << c[0][5] << endl;
 83 //    }
 84 //    return 0;
 85 //}
 86 
 87 
 88 
 89 /*
 90 Super Jumping! Jumping! Jumping!
 91 求解最大递增子序列和
 92 
 93 如:3 1 4
 94 如果第二个数大于第一个数,dp[2]=dp[1]+num[2];如果不大,dp[2]=num[2]; dp[3]=7表示三个数的最大值
 95 首先比较num[3]和num[1],如果num[3]>num[1],dp[3]=7先存下来,如果num[3]>num[2],dp[3]=5依旧存下来;
 96 还有一种如果num[3]比前两个值都小,dp[3]=num[3]; 最后在存下来的dp[3]中找到一个最大的
 97 */
 98 //int num[1010], dp[1010];
 99 //
100 //int main()
101 //{
102 //    int n, Max;
103 //    while (cin >> n)
104 //    {
105 //        if (n == 0)
106 //            break;
107 //        Max = 0;
108 //        memset(dp, 0, sizeof(dp));
109 //        for (int i = 0; i < n; i++)
110 //        {
111 //            cin >> num[i];
112 //        }
113 //        dp[0] = num[0];
114 //        for (int i = 1; i < n; i++)
115 //        {
116 //            for (int j = 0; j<i; j++)
117 //            {
118 //                if (num[i] > num[j])
119 //                    dp[i] = max(dp[i], dp[j] + num[i]);
120 //            }
121 //            dp[i] = max(dp[i], num[i]);
122 //        }
123 //        for (int i = 0; i<n; i++)
124 //        {
125 //            Max = max(Max, dp[i]);
126 //        }
127 //        cout << Max << endl;
128 //    }
129 //    return 0;
130 //}
131 
132 
133 
134 /*
135 Max Sum
136 calculate the max sum of a sub-sequence
137 */
138 int main()
139 {
140     int i, Case = 1, t, start, end, n, pos, now, before, max;
141     cin >> t;
142     while (t--)
143     {
144         cin >> n;
145         for (i = 1; i <= n; i++)
146         {
147             cin >> now;
148             if (i == 1)
149             {
150                 max = before = now;  
151                 pos = start = end = 1;
152             }
153             else
154             {
155                 if (now > now + before)
156                 {
157                     before = now;
158                     pos = i;
159                 }
160                 else
161                     before += now;
162             }
163             if (before > max)
164             {
165                 max = before;
166                 start = pos;
167                 end = i;
168             }    
169         }
170         printf_s("Case %d:
%d %d %d
", Case++, max, start, end);
171         printf_s("
");
172     }
173     return 0;
174 }
原文地址:https://www.cnblogs.com/ht-beyond/p/4564923.html