第一道动规题目,昨天看的题目,今天才做出来,,昨天理解错题意了,
题目说的是绝对切割长度,而不是相对的,请注意。。。
思路:
对切割顺序进行枚举,
对于需要切割的长度【25,50,75】则寻找第一次切割的位置。所以对位置25,50,75各来一次。其实这样还是暴力,只不过表格记录了已经计算过的状态,省时一些罢了。
这里我用的是从底向上递推来填表的
注意这里的小技巧:对于【25,50,75】来说。存的时候把0和100也要存进去。【0,25,50,75,100】
状态方程:f[m][n] = min{f[m][k]+f[k][n]+a[n]-a[m];}(m<k<n)
代码如下:
#include <cstdio>
#define N 55
#define INF 0xfffffff
int l, n, a[N], dp[N][N];
void solve()
{
for(int i = 1; i < n; i++) dp[i][i+1] = 0;
for(int len = 2; len < n; len++)
for(int s = 1; s <= n-len; s++)
{
int &ans = dp[s][s+len], tt;
ans = INF;
for(int k = s; k < s+len; k++)
{
tt = dp[s][k]+dp[k][s+len]+a[s+len]-a[s];
ans = ans>tt?tt:ans;
}
}
}
int main()
{
while(scanf("%d",&l),l)
{
scanf("%d",&n);
a[1] = 0;
for(int i = 2; i <= n+1; i++) scanf("%d",&a[i]);
a[n+=2] = l;
solve();
printf("The minimum cutting is %d.\n",dp[1][n]);
}
return 0;
}