10003 - Cutting Sticks(DP)
来源:互联网 发布:类似于完美世界 知乎 编辑:程序博客网 时间:2024/06/05 10:03
类似于最优矩阵链乘,将长区间划分成段区间求解,换句话说:长区间依赖于段区间 。 因此如果利用三重循环递推的话,枚举的顺序应该是木棍的长度从小到大,因为长区间依赖于短区间的最优解 。 所以动态规划的重点我认为就是对状态的定义和动态规划的方向, 状态的定义要确保覆盖所有状态,规划的方向要遵循一个状态依赖于另一个早已解决的状态。 所以该题有两种解决方法:记忆化搜索和递推 。
我分别用这两种方法AC了,记忆化搜索更简单易想,耗时0.339。但是递推更快!耗时0.086 。细节请见代码:
1.记忆化搜索:
#include<bits/stdc++.h>using namespace std;const int INF = 2000000000;int n,l,a[55],d[55][55];int dp(int i,int j) { int& ans = d[i][j]; if(ans!=-1) return ans; ans = INF; for(int k=i+1;k<j;k++) { ans = min(ans,dp(i,k) + dp(k,j) + a[j] - a[i]); } return ans;}int main() { while(~scanf("%d",&l)&&l) { scanf("%d",&n); memset(d,-1,sizeof(d));//初始化特殊值 for(int i=0;i<=n;i++) d[i][i+1] = 0; //初始化边界 for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[n+1] = l; a[0] = 0; printf("The minimum cutting is %d.\n",dp(0,n+1)); } return 0;}
2.递推:
#include<bits/stdc++.h>using namespace std;const int INF = 2000000000;int n,l,a[55],d[55][55];int main() { while(~scanf("%d",&l)&&l) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[n+1] = l; a[0] = 0; for(int len=1;len<=n+1;len++) { //按照木棍长度从小到大递推 for(int i=0;i<=n;i++) {//i + len 就是j if(i+len > n+1) break; d[i][i+len] = (len == 1 ? 0 : INF); for(int k=i+1;k<i+len;k++) { //寻找切割点 d[i][i+len] = min(d[i][i+len],d[i][k] + d[k][i+len] + a[i+len] - a[i]); } } } printf("The minimum cutting is %d.\n",d[0][n+1]); } return 0;}
2 0
- 10003 - Cutting Sticks(DP)
- uva 10003 Cutting Sticks (区间dp)
- uva 10003 Cutting Sticks(区间DP)
- UVA 10003 - Cutting Sticks(区间DP)
- Uva 10003-Cutting Sticks(区间DP)
- uva 10003 Cutting Sticks (DP)
- UVA - 10003 - Cutting Sticks (区间DP)
- UVa 10003:Cutting Sticks(DP)
- UVA 10003 Cutting Sticks(区间DP)
- uva 10003 Cutting Sticks(区间DP)
- Uva 10003 Cutting Sticks (区间dp)
- UVaOJ 10003 Cutting Sticks(区间DP)
- 10003 Cutting Sticks(区间dp)
- UVa 10003 Cutting Sticks (DP)
- UVaOJ 10003 - Cutting Sticks(dp)
- uva 10003 - Cutting Sticks(dp)
- Cutting Sticks - UVa 10003 dp
- [UVA 10003]Cutting Sticks[DP]
- Android中加载的图片自动适应屏幕(新手)
- Android Fragment的标准写法
- 微信PC版为什么这么设计?
- 欢迎使用CSDN-markdown编辑器
- 类中static并没有那么简单
- 10003 - Cutting Sticks(DP)
- iOS UIImageView 圆角
- Two Wrongs Can Make a Right (and Are Difficult to Fix)
- C++11并发之std::mutex
- 21-Tomcat不编译项目
- Ubuntu Coding for Your Friends
- The Unix Tools Are Your Friends
- 各种图像格式
- LeetCode || Implement Queue using Stacks