uva_10003 Cutting Sticks
2012-10-29 22:07
483 查看
这里的根据矩阵连乘的原理一样 dp[i][j] = min(dp[i][k]+dp[k][j]+len[i,j]); 由于状态表示比较复杂,果断使用记忆化搜索 ok,一开始开数组1000*1000超时了,当时一面茫然.. 然后仔细想想,可以把数组开成50*50的,0.3s Accepted.状态没有减少 估计是这里的测试数据case 太多了,主要的时间是使用在dp数组的初始化了
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 53 #define INF 0x3f3f3f3f int mark[MAXN], dp[MAXN][MAXN], mark_pos; int dynamic_programming(const int &l, const int &r) { if( -1 != dp[l][r] ) { return dp[l][r]; } int rst(INF), flag(0); for(int i = l+1; i < r; i ++) { dp[l][i] = (-1 == dp[l][i])? dynamic_programming(l, i) : dp[l][i]; dp[i][r] = (-1 == dp[i][r])? dynamic_programming(i, r) : dp[i][r]; flag = 1; rst = min( dp[l][i]+dp[i][r]+(mark[r]-mark[l]), rst ); } dp[l][r] = (flag)? rst : 0; return dp[l][r]; } int main(int argc, char const *argv[]) { #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); #endif int n, m, v; while( scanf("%d", &n) && n ) { scanf("%d", &m); memset(dp, -1, sizeof(dp)); mark_pos = 0; mark[ mark_pos ++ ] = 0; for(int i = 0; i < m; i ++) { scanf("%d", &v); mark[ mark_pos ++ ] = v; } mark[ mark_pos ++ ] = n; printf("The minimum cutting is %d.\n", dynamic_programming(0, mark_pos-1)); } return 0; }
相关文章推荐
- uva 10003 Cutting Sticks(区间DP)
- UVA-10003 Cutting Sticks
- UVA 10003 - Cutting Sticks【DP】
- UVA 10003 Cutting Sticks
- uva 10003 Cutting Sticks
- uva 10003 Cutting Sticks
- uva 10003 Cutting Sticks (DP)
- Uva 10003 Cutting Sticks (区间dp)
- UVA 10003 Cutting Sticks(区间dp)
- 区间dp uva 10003 - Cutting Sticks
- Uva 10003-Cutting Sticks(区间DP)
- UVa 10003 Cutting Sticks
- uva 10003 - Cutting Sticks 动态规划
- uva 10003 Cutting Sticks 【区间dp】
- Uva-10003-Cutting Sticks
- UVa 10003 - Cutting Sticks
- uva10003 - Cutting Sticks
- UVA 10003(p278)----CUtting Sticks
- uva:10003 - Cutting Sticks
- UVA - 10003 - Cutting Sticks(动态规划)