65,211
社区成员
发帖
与我相关
我的任务
分享#include <iostream>
#include <stdlib.h>
using namespace std;
int main(int argc, char *argv[])
{
int n,i,j,k,p,sum=0,m,max=0,*a,**f,t;
cout<<"请输入石子的堆数:";
cin>>n;
a=new int[2*n];//动态数组存储单元
a[0]=0;
cout<<"请输入中每堆石子的个数:"<<endl;
for(i=1;i<=n;i++)
cin>>a[i];//输入石子各堆数的个数
for(t=1;t<n;t++)
{
a[n+t]=a[t];
}//形成一个看似循环的数组
for(t=1;t<2*n;t++)
f=new int *[n+1];//为动态二维数组分配内存单元
for(int i=0;i<=n;i++)
f[i]=new int [n+1];
for(i=0;i<=n;i++)//为动态二维数组初始化为0
for(j=0;j<=n;j++)
f[i][j]=0;
for(i=1;i<=n;i++)//数组第一列赋值为0(经分析得)
f[i][1]=0;
for(j=2;j<=n;j++)//为数组其他元素赋值
{
for(i=1;i<=n;i++)
{
max=0;
for(k=1;k<=j-1;k++)
{
m=f[i][k]+f[(i+k-1)%n+1][j-k];
if(max<m)
max=m;
}
sum=0;
for(p=i;p<=i+j-1;p++)//最终每堆石子都将有两堆石子合并
sum=sum+a[p];
f[i][j]=sum+max;
}
}
max=f[1][n];//对最后一列寻找最大值即为最大得分
for(i=1;i<=n;i++)
{
if(max<f[i][n])
max=f[i][n];
}
cout<<"最大得分为:"<<max;
system("PAUSE");
return 0;
}//应该是正确的吧
long int date[101];
long int f[101][101];
long int sum[101][101];
int a[101];
int max(int a,int b);
void fac(int a[],int N);
int main(int argc, char *argv[])
{
int N;
cout <<"请输入石子的堆数:" <<endl;
cin>>N;
cout <<"请输入各堆的石子数:" <<endl;
for(int i=1;i <=N;i++)
cin>>date[i];
for(int i=1;i <=N;i++)
f[i][1]=date[i];
for(int j=2;j <=N;j++)
for(int i=1;i <=N;i++)
{
sum[i][j] = date[i] + sum[i % N + 1][j-1];
}
for(int j=2;j <=N;j++)
for(int i=1;i <=N;i++)
{
for(int k=1;k <=j-1;k++)
{
f[i][j]=max(f[i][k]+f[i+k][j-k]+sum[i][j],f[i][j]);
}
}
for(int i=1;i <=N;i++)
a[i]=f[i][N];
fac(a,N);
cout <<"最大得分为:" <<a[1] <<endl;
system("PAUSE");
return 0;
}
int max(int a,int b)
{
if(a>=b) return a;
else
return b;
}
void fac(int a[],int N)
{
for(int i=1;i <N-1;i++)
for(int j=1;j <N-1-i;j++)
{
if(a[j] <a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}