UVA 10003 Cutting Sticks
来源:互联网 发布:网络社交媒体 编辑:程序博客网 时间:2024/06/15 13:36
题目链接~~>
做题感悟:这题属于区间DP,开始做事看着和矩阵连乘一样,结果没想出状态转移方程。
解题思路:给木棍添加 一个头一个尾就成为矩阵连乘问题了,从小递推到达最终结果就为dp[ 0 ][ L ] .
状态方程:dp[ i ][ j ] = min { dp [ i ] [ k ] +dp[ k ] [ j ] +d[ j ] - d[ i ] } dp[ i ][ j ] 代表从第 i 处到第 j 处的最优解。
代码:
#include<stdio.h>#include<queue>#include<string.h>#include<stdlib.h>#include<string.h>#include<algorithm>#include<iostream>#define INT long long intconst int INF = 99999999 ;using namespace std ;const int MX = 50 + 10 ;int L,n ;int dp[MX][MX],a[MX] ;void SectionDP(){ for(int i=0 ;i<=n ;i++) dp[i][i+1]=0 ; for(int t=2 ;t<=n ;t++) for(int i=0 ;i+t<=n ;i++) { dp[i][i+t]=INF ; for(int j=i+1 ;j<i+t ;j++) dp[i][i+t]=min(dp[i][i+t],dp[i][j]+dp[j][i+t]+a[i+t]-a[i]) ; } cout<<"The minimum cutting is "<<dp[0][n]<<"."<<endl ;}int main(){ while(scanf("%d",&L),L) { scanf("%d",&n) ; a[0]=0 ; // 添加尾 for(int i=1 ;i<=n ;i++) scanf("%d",&a[i]) ; a[++n]=L ;// 添加头 SectionDP() ; } return 0 ;}
0 0
- UVa 10003 Cutting Sticks
- UVA 10003 - Cutting Sticks
- UVa 10003 - Cutting Sticks
- uva 10003 Cutting Sticks
- uva:10003 - Cutting Sticks
- UVa 10003 Cutting Sticks
- UVa 10003 Cutting Sticks
- UVa 10003 - Cutting Sticks
- UVA 10003 Cutting Sticks
- Uva - 10003 - Cutting Sticks
- UVa 10003 - Cutting Sticks
- UVa 10003 - Cutting Sticks
- UVA 10003 Cutting Sticks
- UVa 10003 Cutting Sticks
- UVa 10003 - Cutting Sticks
- Uva-10003-Cutting Sticks
- UVa:10003 Cutting Sticks
- UVA - 10003 Cutting Sticks
- 单例模式学习笔记
- 我是如何来定时发布文章的
- Mysql:is not allowed to connect to this MySQL server
- ios 程序启动执行顺序
- android之ImageView
- UVA 10003 Cutting Sticks
- 【队列】poj1250 Tanning Salon
- DDD Reference
- 知识总结
- UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
- Unity3D面试——真实的面试
- 六个细节改变提升 Android L 用户体验
- B - Adding Reversed Numbers
- CF 255 DIV2 D DZY Loves Modification(优先队列)