题目
源地址:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=944
理解
之前在COJ上好像做过类似的题目。
同样是木材切割,不过这次每次切割都会消耗跟木棒长度相同的代价,要求的是最小代价的切割。
小脑一动就可以知道,存在递推公式:
dp[x][y]=min(dp[x][y],dp[x][a[k]]+dp[a[k]][y]+y-x)
代码
#define MAXN 1000+10
#define MAXM 50+10
int a[MAXM],dp[MAXN][MAXN];
int n,m;
void init()
{
memset(a,0,sizeof(a));
scanf("%d", &m);
a[0]=0,a[m+1]=n;
for(int i=1; i<=m; i++)
{
scanf("%d", &a[i]);
}
for(int i=0; i<=m; i++)
{
dp[a[i]][a[i+1]]=0;
}
}
int main(int argc, char const *argv[])
{
while(~scanf("%d",&n)&&n)
{
init();
for(int l=2; l<=m+1; l++)
{
for(int i=0; i<=m-l+1; i++)
{
int j=i+l,x=a[i],y=a[j];
dp[x][y]=inf;
for(int k=i+1; k<j; k++)
{
dp[x][y]=min(dp[x][y],dp[x][a[k]]+dp[a[k]][y]+y-x);
}
}
}
printf("The minimum cutting is %d.\n",dp[0][n]);
}
return 0;
}
更新日志
- 2014年11月16日 已AC。