UVA10003---Cutting Sticks(简单区间dp)

来源:互联网 发布:淘宝店如何加入返利网 编辑:程序博客网 时间:2024/05/20 12:46

任意两个切割点之间无法再分割
所以如果设dp[i][j] 表示从i位置切到j位置其实没有多大意义,亲测这样会TLE
dp[i][j]表示切割第i个切割点开始的位置到第j个切割点的位置结束的木棍的最小花费
时间复杂度O(n3)

/*************************************************************************    > File Name: uva10003.cpp    > Author: ALex    > Mail: zchao1995@gmail.com     > Created Time: 2015年05月21日 星期四 21时21分07秒 ************************************************************************/#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <queue>#include <stack>#include <map>#include <bitset>#include <set>#include <vector>using namespace std;const double pi = acos(-1.0);const int inf = 0x3f3f3f3f;const double eps = 1e-15;typedef long long LL;typedef pair <int, int> PLL;int dp[55][55];int pos[55];int main() {    int n, l;    while (~scanf("%d", &l), l) {        memset(dp, inf, sizeof(dp));        scanf("%d", &n);        pos[0] = 0;        for (int i = 1; i <= n; ++i) {            scanf("%d", &pos[i]);            dp[i - 1][i] = 0;        }        pos[n + 1] = l;        dp[n][n + 1] = 0;        for (int i = n; i >= 0; --i) {            for (int j = i + 1; j <= n + 1; ++j) {                for (int k = i; k <= j; ++k) {                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + pos[j] - pos[i]);                }            }        }        printf("The minimum cutting is %d.\n", dp[0][n + 1]);    }}
0 0
原创粉丝点击