题目描述:
有n堆石子,每次可以将相邻两堆合并为一堆,这次操作消耗的体力是这两堆石子数之和。最终需要将n堆石子合并为一堆,问最少要多少体力?
这些石子十分特殊:一开始的时候第i堆石子有i个石子,i=1,2,...,n.
有n堆石子,每次可以将相邻两堆合并为一堆,这次操作消耗的体力是这两堆石子数之和。最终需要将n堆石子合并为一堆,问最少要多少体力?
这些石子十分特殊:一开始的时候第i堆石子有i个石子,i=1,2,...,n.
#include
<
iostream
>
#include < cstring >
using namespace std;
int f[ 1024 ][ 1024 ];
int main()
... {
int i,j,k,tmp,min;
int num;
cin>>num;
num+=1;
memset(f,0,sizeof(f));
for(k=1;k<num-1;k++)
for(i=1;i+k<num;i++)
...{
min=1000000000;
tmp=(i+k+1)*(i+k)/2-(i-1)*i/2;
for(j=i;j<i+k;j++)
...{
if(f[i][j]+f[j+1][i+k]<min)
min=f[i][j]+f[j+1][i+k];
}
f[i][i+k]=min+tmp;
}
cout<<f[1][num-1]<<endl;
return 0;
}
#include < cstring >
using namespace std;
int f[ 1024 ][ 1024 ];
int main()
... {
int i,j,k,tmp,min;
int num;
cin>>num;
num+=1;
memset(f,0,sizeof(f));
for(k=1;k<num-1;k++)
for(i=1;i+k<num;i++)
...{
min=1000000000;
tmp=(i+k+1)*(i+k)/2-(i-1)*i/2;
for(j=i;j<i+k;j++)
...{
if(f[i][j]+f[j+1][i+k]<min)
min=f[i][j]+f[j+1][i+k];
}
f[i][i+k]=min+tmp;
}
cout<<f[1][num-1]<<endl;
return 0;
}
采用三层循环,动归实现.