UVA10003 简单DP
2017-02-16 15:20
204 查看
题意
有一段长度为l的木棍,需要切割n次,切割点分别为c(1-n),每切割一次的费用为切割的木棍长度。求切割n次所需的最小费用。题解
设dp[i][j]为i到j部分全部切割所需的最小费用,则可得状态转移方程dp[i][j]=min(dp[i][k]+dp[k][j]+p[j]-p[i],dp[i][j])。(p[i]为i点的位置)注意事项
注意p[0]代表木棍起点初始化为0,p[n+1]代表木棍终点初始化为len代码
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #define INF 1e9 using namespace std; int dp[60][60],p[60]; int main() { int len; int n; while(scanf("%d",&len)){ if(len==0) break; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&p[i]); p[0]=0; p[n+1]=len; for(int i=0;i<=n+1;i++){ for(int j=0;j<=n+1;j++){ if(i==j+1||j==i+1){ dp[i][j]=0; dp[j][i]=0; }else{ dp[i][j]=INF; dp[j][i]=INF; } } } for(int i=n+1;i>=0;i--){ for(int j=i+2;j<=n+1;j++){ for(int k=i+1;k<j;k++){ dp[i][j]=min(dp[i][k]+dp[k][j]+p[j]-p[i],dp[i][j]); } } } printf("The minimum cutting is %d.\n",dp[0][n+1]); } return 0; }
相关文章推荐
- uva 10003 (简单DP)
- uva 10003 Cutting Sticks 简单区间dp
- UVa 116 Unidirectional TSP(简单旅行商DP)
- UVa 437 The Tower of Babylon(简单DP)
- UVA116----简单的DP,但是输出路径比较坑
- uva10003 - Cutting Sticks(简单动规)
- uva116 - Unidirectional TSP(简单DP)
- [简单DP] UVA 10051 Tower of Cubes
- uva 10003 Cutting Sticks (区间dp)
- UVa 10003 - Cutting Sticks 区间dp
- 【水】uva10003 练手二维DP
- uva 10003 - Cutting Sticks(区间DP)
- UVa 10404 Bachet's Game(简单DP)
- UVa 10453 Make Palindrome(简单DP)
- UVa 10201 Adventures in Moving(简单DP)
- UVa 10003 - Cutting Sticks 区间dp
- UVa 562 Dividing coins(简单DP)
- UVa 11137 Ingenuous Cubrency(简单DP)
- UVa 607 Scheduling Lectures(简单DP)
- uva10003 - Cutting Sticks(DP,区间)