我试了下不用递归做的,而是用数组来填表做的,也能通过测试,
下面贴出代码,大家多多指教:
# include <iostream>
# include <fstream>
using namespace std;
# define MAX 1000
int book[MAX];
int F[MAX][MAX],G[MAX][MAX];
void min(int n)//填表函数
{
int i,j,k,temp=9999999;
for(i=1;i<n;i++)
{
for(j=1;j<=n-i;j++)
{
for(k=j;k<j+i;k++)
{
if(temp>F[j][k]+F[k+1][j+i])
temp=F[j][k]+F[k+1][j+i];
}
F[j][j+i]=temp+G[j][j+i];
temp=9999999;
}
}
}
int main()
{
int s,e,n,w,v,i,j,k;
ifstream f;
f.open("data.txt");
f>>n;
for(i=1;i<=n;i++)//初始化
{
f>>w>>v;
book[i]=w-v;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
F[i][j]=0;
G[i][j]=0;
for(k=i;k<=j;k++)
{
G[i][j]=G[i][j]+book[k];
}
}
}
min(n);//调用填表函数
cout<<"请输入要合并的书堆的起始和终止位置: "<<endl;
cin>>s>>e;
cout<<"最小力气为: "<<F[s][e]<<endl;
f.close();
return 0;
}
[ 本帖最后由 realfree 于 2010-10-23 01:55 编辑 ]
下面贴出代码,大家多多指教:
# include <iostream>
# include <fstream>
using namespace std;
# define MAX 1000
int book[MAX];
int F[MAX][MAX],G[MAX][MAX];
void min(int n)//填表函数
{
int i,j,k,temp=9999999;
for(i=1;i<n;i++)
{
for(j=1;j<=n-i;j++)
{
for(k=j;k<j+i;k++)
{
if(temp>F[j][k]+F[k+1][j+i])
temp=F[j][k]+F[k+1][j+i];
}
F[j][j+i]=temp+G[j][j+i];
temp=9999999;
}
}
}
int main()
{
int s,e,n,w,v,i,j,k;
ifstream f;
f.open("data.txt");
f>>n;
for(i=1;i<=n;i++)//初始化
{
f>>w>>v;
book[i]=w-v;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
F[i][j]=0;
G[i][j]=0;
for(k=i;k<=j;k++)
{
G[i][j]=G[i][j]+book[k];
}
}
}
min(n);//调用填表函数
cout<<"请输入要合并的书堆的起始和终止位置: "<<endl;
cin>>s>>e;
cout<<"最小力气为: "<<F[s][e]<<endl;
f.close();
return 0;
}
[ 本帖最后由 realfree 于 2010-10-23 01:55 编辑 ]