UVA 10003 Cutting Sticks 区间dp

点击打开题目链接

锯木头,一根长 l 的木头,有 n 个位置可以锯,每次锯的花费为当前木头的长度。

求如何安排锯的顺序使得在 n 个位置锯后花费最小。

区间dp。dp[ L ][ R ] 表示合理安排锯的位置,从第 L 个位置距到第 R 个位置的最小花费。

则dp[ L ][ R ] = min { dp[ L ][ M ] + dp[ M + 1 ][ R ] + a[ R ] - a[ L - 1 ] , L <= M < R };


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int INF = 0xfffffff;
const int MAXN = 50 + 5;
int dp[MAXN][MAXN], a[MAXN];

int main()
{
    int Len, n, x;
    while (~scanf("%d", &Len), Len)
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
        }
        a[n + 1] = Len;

        for (int i = 2; i <= n + 1; i++)        //长度
        {
            for (int L = 1; L <= n - i + 2; L++)    //锯的位置起点
            {
                int R = L + i - 1;          //终点
                dp[L][R] = INF;         //初始化
                int Min = INF;
                for (int M = L; M < R; M++) //求最优解
                {
                    Min = min(Min, dp[L][M] + dp[M + 1][R] + a[R] - a[L - 1]);
                }
                dp[L][R] = min(Min, dp[L][R]);
            }
        }
        printf("The minimum cutting is %d.\n", dp[1][n + 1]);
    }
    return 0;
}

你可能感兴趣的:(dp,ACM)