动态规划
记录点滴。
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:\n%d %d %d\n", Case++, max, start, end); 171 printf_s("\n"); 172 } 173 return 0; 174 }