http://codevs.cn/problem/1154/
类似于石子合并(石子合并都比这题简单太多啦)
一串项链首尾相连,每一个珍珠都有一定能量,两颗合并释放能量,求可以释放的最大能量。
由于题目给的测试案例很有规律,先找的规律做的,但是明显是错误的,后来用贪心做的,排序找最大的一项。很无奈的也wa啦,无奈看了题解说和石子合并差不多,故又尝试,百试百错。又对着例程找了些可能的错误,一改起来就没边了。最终勉强做出来啦,不过还要花一定时间再去好好理解下。
具体的解题思路大概是,这个链可以循环,不一定几个组合在一起值为最大,将珍珠几个几个组合在一起,求一个最大值。
#include<iostream>
using namespace std;
int n;
int mod(int x)
{
return (x - 1) % n + 1;
}
int main()
{
int a[300] = { 0 };
int dp[105][105] = { 0 };
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
a[n + i] = a[i];
}
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int temp = -9999;
for (int k = j + 1; k <= j + i - 1; k++)
{
if (temp < dp[j][mod(k - 1)] + dp[mod(k)][mod(j + i - 1)] + a[j - 1] * a[mod(k - 1)] * a[mod(j + i-1)])
{
temp = dp[j][mod(k - 1)] + dp[mod(k)][mod(j + i - 1)] + a[j - 1] * a[mod(k - 1)] * a[mod(j + i-1)];
}
}
dp[j][mod(j+i-1)] = temp;
}
}
int temptemp = -11111;
for (int i = 1; i <= n; i++)
{
if (temptemp < dp[i][mod(i + n - 1)])
temptemp = dp[i][mod(i + n - 1)];
}
cout << temptemp << endl;
system("pause");
return 0;
}