UVA 10003 Cutting Sticks(区间dp)
2016-02-27 16:44
429 查看
题目链接:UVA - 10003 Cutting Sticks
dp[i][j] = min(dp[i][k]+dp[k][j]+a[j]-a[i]) |i
题意
给一长度为L的棍子,和n个切割点,每次切割的代价为当前的棍子的长度,问最少的总切割代价是多少。思路
典型的区间dpdp[i][j] = min(dp[i][k]+dp[k][j]+a[j]-a[i]) |i
代码
递推
[code]#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <vector> #include <cmath> using namespace std; const int N = 59; int a ; int dp ; int main() { int l; while(~scanf("%d", &l) && l) { int n; memset(dp, 0x3f, sizeof(dp)); scanf("%d", &n); for(int i=1; i<=n; i++) { dp[i-1][i] = 0; scanf("%d", &a[i]); } dp [n+1] = 0; a[0] = 0; a[n+1] = l; for(int len=2; len<=n+1; len++) for(int i=0; i+len<=n+1; i++) for(int k=i+1; k<i+len; k++) dp[i][i+len] = min(dp[i][i+len], dp[i][k]+dp[k][i+len]+a[i+len]-a[i]); printf("The minimum cutting is %d.\n", dp[0][n+1]); } return 0; }
记忆化搜索
[code]#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <vector> #include <cmath> using namespace std; const int N = 59; int a ; int dp ; int dfs(int i, int j) { if(dp[i][j] != -1) return dp[i][j]; int ans = 0x3f3f3f3f; for(int k=i+1; k<j; k++) ans = min(ans, dfs(i,k)+dfs(k,j)+a[j]-a[i]); return dp[i][j] = ans; } int main() { int l; while(~scanf("%d", &l) && l) { int n; memset(dp, -1, sizeof(dp)); scanf("%d", &n); for(int i=1; i<=n; i++) { scanf("%d", &a[i]); dp[i-1][i] = 0; } dp [n+1] = 0; a[0] = 0; a[n+1] = l; printf("The minimum cutting is %d.\n", dfs(0, n+1)); } return 0; }
相关文章推荐
- 有一种acm题目叫做,奇葩!
- Java学习笔记(类的可见性) http://blog.csdn.net/hawksoft/article/details/8453637
- 【Android】Android自定义ViewGroup
- 设计模式-行为型模式-创建者模式
- Memcached基本操作
- Java 包(package) http://www.runoob.com/java/java-package.html
- 常用网站链接
- 在VS2015中用C++创建MFC规则动态库DLL
- 棋盘问题
- 《github一天一道算法题》:分治法求数组最大连续子序列和
- Java(多)线程中注入Spring的Bean
- Dividing (hdu 1059 多重背包)
- zsh 安装和使用, 以及安装主体
- response.getWriter().write 中文乱码问题
- 操作系统基础
- 全蛋蛋糕做法
- svn恢复到之前某个版本号
- Xcode7,ios9 issue ,warning合集
- memcached安装
- 机器学习 - 概念学习