UVa 10003 - Cutting Sticks

传送门

UVa 10003 - Cutting Sticks

思路

参考了wangtaoking1的解题报告
就是按照切点去切就行,然后返回最小值,输出TAT。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 50 + 10;
const int INF = 2147483647;

int num[MAXN];
int dp[MAXN][MAXN];

int DP(int i, int k)
{
    int &ans = dp[i][k];
    if (i + 1 == k)
        return ans = 0;
    if (ans != -1)
        return ans;
    ans = INF;
    for (int j = i + 1; j < k; j++)
        ans = min(ans, DP(i, j) + DP(j, k) + num[k] - num[i]);
    return ans;
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int len, n, i, j;
    while (scanf("%d", &len), len)
    {
        memset(dp, -1, sizeof(dp));
        scanf("%d", &n);
        for (i = 1; i <= n; i++)
            scanf("%d", #[i]);
        num[0] = 0, num[n + 1] = len;
        int ans = DP(0, n + 1);
        printf("The minimum cutting is %d.\n", ans);
    }
    return 0;
}

Powered by Jekyll and Theme by solid