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;
}