您的位置:首页 > 其它

Cutting Sticks UVA 10003(区间DP)

2018-02-09 01:50 429 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: