当前位置:编程学习 > C#/ASP.NET >>

石子分法?(后继石子合并法)?

有一堆大小为1.5毫米的石子总数为289个,可将其4个分为一组。现任意取出一小堆,问这一小堆的石子总数。(答案可分为三种可能数量) --------- 向各位高手请讨教 

看到一个同友的编程,题目看上去有点相似。 
Problem F:石子合并 

Time Limit:1000MS Memory Limit:65536K 
Total Submit:1180 Accepted:386 

Language: not limited 


Description 

在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 

例如,图1所示的4堆石,每堆石子数(从最上面的一堆数起,顺时针数)依次为4、5、9、4。则3次合并得分总和最小的方案为图2,得分总和最大的方案为图3。 
编程任务: 
对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分。 


Input 

输入第1 行是正整数n,1 <=n <=100,表示有n堆石子。 
第二行有n个数,分别表示每堆石子的个数。 

Output 

程序运行结束时,输出两行,第1 行中的数是最小得分;第2 行中的数是最大得分。 

Sample Input 



4 4 5 9 

Sample Output 


43 
54 --------------------编程问答-------------------- 做个标记 关注 --------------------编程问答-------------------- #include <stdio.h>
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define MAXN 110
#define oo 1000000000
int main()
{int n,i,j,k,x,a[MAXN],sum[MAXN][MAXN]={0},fmin[MAXN][MAXN]={0},fmax[MAXN][MAXN]={0};
while(EOF!=scanf("%d",&n))
{for(i=1;i<=n;++i)
scanf("%d",&a[i]);
for(i=1;i<=n;++i)
sum[i][1]=a[i];
for(j=2;j<=n;++j)
for(i=1;i<=n;++i)
sum[i][j]=a[i]+sum[i%n+1][j-1];
for(j=2;j<=n;++j)
{for(i=1;i<=n;++i)
{fmin[i][j]=oo;
fmax[i][j]=0;
for(k=1;k<j;++k)
{x=(i+k-1)%n+1;
fmin[i][j]=min(fmin[i][j],fmin[i][k]+fmin[x][j-k]+sum[i][j]);
fmax[i][j]=max(fmax[i][j],fmax[i][k]+fmax[x][j-k]+sum[i][j]);}}}
x=fmin[1][n];
for(i=2;i<=n;++i)
x=min(x,fmin[i][n]);
printf("%d\n",x);
x=fmax[1][n];
for(i=2;i<=n;++i)
x=max(x,fmax[i][n]);
printf("%d\n",x);}
return 0;} 


补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,