d(i,j)是第i个和第j个节点之间最优切割法.
这个状态转移方程太适合写记忆化搜索了,但是写迭代就有点gg.刘汝佳书上说这样的"正确的方法是按照j-i递增的顺序递推,因为长区
间的值依赖于短区间的值 "那么就算区间长度为0,1,2,3.....这样迭代下去.
还是第一次写记忆化搜索.
1.以区间分解分割(好像是理所当然).
2.存区间节点数组的边界要注意.
3.我输出少了个'.'号...........
4.0x3f可以用来初始化INF,大概是1e9级别的.
#include <bits/stdc++.h>
using namespace std;
#define INF 100000000
int n, l;
int d[55][55];
int cut[55];
int dp(int i, int j)
{
if(d[i][j] < INF)
return d[i][j];
if(i >= j - 1)
return d[i][j] = 0;
for(int k = i + 1; k < j; k++){
d[i][j] = min(dp(i, k) + dp(k, j) + cut[j] - cut[i], d[i][j]);
}
return d[i][j];
}
int main()
{
while(scanf("%d", &l) != EOF && l)
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &cut[i]);
cut[n + 1] = l;
memset(d, 0x3f, sizeof d);
printf("The minimum cutting is %d.\n", dp(0, n + 1));
}
return 0;
}