您的位置:首页 > 其它

UVA Cutting Sticks(记忆化搜索)

2013-04-25 10:32 435 查看
方程f[i,j]=0 if i+1==j,min(f[i,k]+f[k,j]+len[j]-len[i]) if 0<=i<j<=n+1

#include <cstdio>
#include <iostream>
#include <memory.h>
using namespace std;
int dp[60][60],len[60],n,L;
int dfs_mem(int i,int j){
if(i+1==j)return 0;
if(dp[i][j]!=-1)return dp[i][j];
dp[i][j]=2100000000;
for (int k=i+1;k<j;++k){
dp[i][j]=min(dp[i][j],dfs_mem(i,k)+dfs_mem(k,j)+len[j]-len[i]);
}
return dp[i][j];
}
int main(){
while (scanf("%d",&L)&&L){
scanf("%d",&n);
memset(dp,-1,sizeof(dp));
len[0]=0;
len[n+1]=L;
for (int i=1;i<=n;++i){
scanf("%d",&len[i]);
}
printf("The minimum cutting is %d.\n",dfs_mem(0,n+1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: