11600. Pick It
Constraints
Time Limit: 5 secs, Memory Limit: 256 MB
Description
You are playing a game of Pick It. You are given a list of positive integers, and you are allowed to select any number other than the first or last number in this list. When you pick a number, that number is removed from the board, and your score increases by the sum of the number that you picked and the sum of the neighbouring numbers.
For example, if the list contained 1 2 3 4 5, and you picked 3, your score would be2+3+4=9. On the next turn, your list would be 1 2 4 5, and if you picked 4 next, your score would be 9+2+4+5 = 20, leaving you with the list 1 2 5. The game concludes when there are only two numbers remaining.
Given a list of numbers, what is the maximum score that you can obtain?
Input
The input will consist of a number of test cases (at most 200 test cases). A test case is of the form n k1 k2 ... kn where n (n ≤ 200) is the number of numbers in the list, and each integer ki satisfies 1 ≤ ki ≤ 100). In all test cases n ≥ 3, except in the case where n=0, which indicates the end of input.
Output
For each test case, output the maximum score attainable.
Sample Input
5 1 2 3 4 5 5 2 1 5 3 4 6 30 20 40 50 70 60 0
Sample Output
30 31 570
Problem Source
2014年每周一赛第八场
http://blog.csdn.net/gwq5210/article/details/40949033
// Problem#: 11600
// Submission#: 3550130
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <stdio.h>
#include <string.h>
unsigned short dp[200][200], w[200], N;
inline int max(int a, int b) {if (a > b) return a; return b;}
int main() {
while (scanf("%d", &N) && N) {
for (int i = 0; i < N; i++) scanf("%d", w + i);
N--;
memset(dp, 0, sizeof(dp));
for (int i = 1; i < N; i++)
for (int j = 1; j + i <= N; j++)
for (int k = j; k < j + i; k++)
dp[j][j + i] = max(dp[j][j + i], dp[j][k] + dp[k + 1][j + i] + w[j - 1] + w[k] + w[j + i]);
printf("%d\n", dp[1][N]);
}
return 0;
}