题目大意
一个气球设计比赛,将N个气球摆成一排,每个气球上都有一个数字表示分数。参赛人员有一把抢,枪中有N发子弹,其中4<=N<=400。参赛人员拿枪每次击中一个气球后都会得到一个相应的分数。获得分数的规则如下:
- 击中的气球两边都有气球,则获得的分数是左边气球数字乘以右边气球的数字
- 若击中的气球只有一边有气球,获得的分数就是该旁边气球的数字
- 若两边都没有气球了,获得的分数就是该击中气球的数字。
不通的射击顺序会得到不同的分数,求可以获得的最高的射击分数。
Sample:
有一排数字1234的气球,如果按照 2 -> 3 -> 1 -> 4的射击顺序,题解如下:
1234,2标红
先击中数字为2的气球,则获得的分数是两边气球数字相乘:score = 1*3
134,3标红
再击中数字为3的气球,则获得的分数是两边气球数字相乘:score = 1* 4
14,1标红
击中数字为1的气球,左边没有气球,所以获得的分数就是右边气球的数字:score = 4
4,4标红
击中数字为4的气球,两边都没有气球了,所以获得的分数就是该气球的数字:score = 4
所以,如果按照上述射击顺序,总共获得的分数为:
Score = 1*3 + 1*4 + 4 + 4 = 15.
如果按照3->2 -> 1 ->4 的顺序,则获得的分数是:
Score = 2*4 + 1*4 + 4 + 4 = 20
这种射击顺序可以获得最高分。
注:每次射击时,只能击中一个气球,不存在同时击中2个或以上气球的情况。
Input:
5
4
1 2 3 4
5
3 10 1 2 5
7
12 48 28 21 67 75 85
8
245 108 162 400 274 358 366 166
10
866 919 840 944 761 895 701 912 848 799
Output
20
100
16057
561630
6455522
#if 0
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS // Ignore build errors when using unsafe functions in Visual Studio.
#endif
#include <iostream>
using namespace std;
#define MAX 100
int N = 0;
int cnt = 0;
int data[MAX], res[MAX], tmpres[MAX];
bool visit[MAX] = {0};
void solution(int num, int score)
{
if (num == N && cnt < score)
{
cnt = score;
for (int i = 0; i < N; i++)
{
res[i] = tmpres[i];
}
return;
}
for (int i = 0; i < N; i++)
{
int left = -1, right = -1;
if (visit[i] == false)
{
for (int j = i + 1; j < N; j++)
{
if (visit[j] == false)
{
right = j;
break;
}
}
for (int j = i - 1; j >= 0; j--)
{
if (visit[j] == false)
{
left = j;
break;
}
}
visit[i] = true;
tmpres[num] = data[i];
if (left >= 0 && right > 0)
solution(num + 1, score + data[left] * data[right]);
else if (left >= 0 && right < 0)
solution(num + 1, score + data[left]);
else if (left < 0 && right > 0)
solution(num + 1, score + data[right]);
else
solution(num + 1, score + data[i]);
visit[i] = false;
}
}
}
void clr()
{
cnt = 0;
for (int i = 0; i < N; i++)
visit[i] = 0;
}
int main(int argc, char **argv)
{
int test_case;
int T;
cin >> T;
/*
Read each test case from standard input.
*/
for (test_case = 1; test_case <= T; ++test_case)
{
/
/*
Please, implement your algorithm from this section.
*/
/
int score = 0;
cin >> N;
//maxTime = M * 24;
for (int i = 0; i <= N - 1; i++)
{
cin >> data[i];
}
solution(0, 0);
int answer, result[MAX];
cin >> answer;
for (int i = 0; i < N; ++i)
{
cin >> result[i];
}
if (cnt == answer)
{
int i = 0;
for (; i < N; ++i)
{
if (res[i] != result[i])
break;
}
if (i == N)
score = 100;
}
cout << score << endl;
clr();
}
return 0; //Your program should return 0 on normal termination.
}
#endif