关闭

石子问题

584人阅读 评论(0) 收藏 举报
题目描述:
有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;
}

采用三层循环,动归实现.
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:66545次
    • 积分:1159
    • 等级:
    • 排名:千里之外
    • 原创:44篇
    • 转载:5篇
    • 译文:0篇
    • 评论:25条
    文章分类
    最新评论