Cutting Sticks UVA 10003(区间DP)

d(i,j)是第i个和第j个节点之间最优切割法.

这个状态转移方程太适合写记忆化搜索了,但是写迭代就有点gg.刘汝佳书上说这样的"正确的方法是按照ji递增的顺序递推,因为长区
间的值依赖于短区间的值
"那么就算区间长度为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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值