算法设计与分析习题3-3 石子合并问题直线排列最大得分

此题有直线,圆形两种问法。 分别有最大得分最小得分解法。简单的dp。
直线最大得分
【算法设计与分析习题3-3 石子合并问题直线排列最大得分】#include
#include


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<return 0;
}

    推荐阅读