此题有直线,圆形两种问法。 分别有最大得分最小得分解法。简单的dp。
直线最大得分
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
int n;
cin>>n;
int a[100],m[100][100];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=2;i<=n;i++)
{
a[i]=a[i]+a[i-1];
}
//默认初始化m[i][i]=0,可以理解为初始的每一堆不合并则得分为0
for(int r=2;r<=n;r++)
{
for(int i=1;i<=n-r+1;i++)
{
int j=i+r-1;
if(m[i+1][j]>m[i][j-1]) //m[i][j]表示从i到j的最大得分,因为只能相邻合并,所以有两种情况,m[i][i]与m[i+1][j]或m[i][j-1]与m[j][j]
m[i][j]=m[i+1][j]+a[j]-a[i-1];
else
m[i][j]=m[i][j-1]+a[j]-a[i-1];
}
}
cout<<m[1][n]<<endl;
return 0;
}