Description
有人说男人如果没有一条金项链就没有牌面, 我胖哥也有一条, 项链分为N段每一段都有自己的权值, L 为自己的权值, R为后面金块的权值, 我们可以将任意两个金块合并成一个, 最终我们需要把N个合并成一个, 每次合并会产生一定的价值, 合并时一定两两相邻, (第一视为和第N相邻);
比如:A 与 A + 1 合并A : L1 = q【A】, R1 = q【A + 1】;
B : L2 = q【A + 1】, R2 = q【A + 2】;
会产生 L1 * R1 * R2 的价值, 生成一个权值为q【A】的金块
Input
输入一个N, (4 <= N <= 100) 表示项链上的金块数
读入N个数, 表示每一个金块的权值, 每个数0 < q【i】 <= 1000;
第N块的后面视为第一块
Output
打印胖哥项链最大的价值
Sample Input Copy
4
2 3 5 10
Sample Output Copy
710
HINT
4 和 1, 4 和 2, 4 和 3
10 * 2 * 3 + 10 * 3 * 5 + 10 * 5 * 10
题意:这个题可能是一个语文非常不好的人出的,反正我是没读懂,大致意思每次消掉一个数,即2*3*5消掉的就是3,然后最后只留下一个数;
思路:这样就构成一个环状,但是在代码里边环状很难实现,所以我们先将n个数复制到后面;然后再遍历;
有两种写法,其实思想是差不多的;
#include<bits/stdc++.h>
using namespace std;
long long a[1010],dp[1010][1010];
int main()
{
long long n;
while(~scanf("%lld",&n))
{
memset(dp,0,sizeof(dp));
long long maxx=0;
for(long long i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
a[i+n]=a[i];
}
for(long long d=2; d<=n; d++)//这里就是开始的地方,也就是大区间;
for(long long i=1; i+d<=2*n; i++)//小区间i->j
{
long long j=i+d;
for(long long k=i; k<j; k++)//k就是划分界限,k+1就是要消掉的数;
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);
}
for(long long i=1;i<=n;i++)/这里max也可以在里边比较,因为在里边是2*n,所以慢了3s;
maxx=max(maxx,dp[i][i+n-1]);//因为i是从1开始的,所以要 -1;
printf("%lld\n",maxx);
}
return 0;
}
一定要开long long 不然WA的很惨;