【UVA】10003-Cutting Sticks(动态规划、矩阵链乘)

2024-09-07 23:58

本文主要是介绍【UVA】10003-Cutting Sticks(动态规划、矩阵链乘),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一道动态规划题,不过似乎可以用回溯水过去,回溯的话效率很烂的。

13988658 10003 Cutting Sticks Accepted C++ 1.882 2014-08-04 09:26:49

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF 1 << 10
#define esp 1e-6
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================*/
#define MAXD 1000 + 10
int n,L;
int arr[MAXD];
int vis[MAXD];
int _dp[MAXD][MAXD];
int dp(int x,int y,int have_cut){ /*当前木棍区间,以及砍了几段木头了*/int ans = INF;int ok  = 0;if(_dp[x][y] > 0) return _dp[x][y];for(int i = x ; i <= y ; i++)for(int k = 0 ; k < n ; k++)if(!vis[k] && arr[k] >= x && arr[k] <= y){ /*该点未切割*/int pos = arr[k];ok = 1;vis[k] = 1;ans = min(ans,dp(x,pos,have_cut + 1) + dp(pos,y,have_cut + 1));vis[k] = 0;}if(!ok)return 0;elsereturn _dp[x][y] = ans + (y - x);
}
int main(){while(scanf("%d",&L) && L){memset(vis,0,sizeof(vis));memset(_dp,-1,sizeof(_dp));scanf("%d",&n);for(int i = 0 ; i < n ; i++)scanf("%d",&arr[i]);int ans = dp(0,L,0);printf("The minimum cutting is %d.\n",ans);}return 0;
}

之后是动规递推

13989008 10003 Cutting Sticks Accepted C++ 0.102 2014-08-04 10:56:30

可以看出来,这效率差的真不是一点半点的。


利用dp[i][j]表示切点i,j之间的线段分割的话需要产生的最小花费,那么可以有递推式:

dp[i][j] = dp[i][k] + dp[k][j] + array[j] - array[i]

所以如果 i = j - 1的话,dp[i][j] = 0;

递推的时候,区间长度大的可以由小的推导得到,所以按照区间长度的大小进行递推

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF 1 << 20
#define esp 1e-6
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================*/
#define MAXD 50 + 5
int L,n,array[MAXD];
int dp[MAXD][MAXD];
bool Input(){scanf("%d",&L);if(!L)return false;scanf("%d",&n);for(int i = 1 ; i <= n ;i++)scanf("%d",&array[i]);array[0] = 0;array[n + 1] = L;return true;
}
void init(){for(int i = 0 ; i < n + 1; i++)for(int j = i + 1; j <= n + 1; j++)if(i + 1 == j)dp[i][j] = 0;elsedp[i][j] = INF;return ;
}
void DP(){init();/*按照区间长度由小到大的长度进行递推*/for(int j = 2 ; j <= n + 1; j++)for(int i = 0; i + j <= n + 1 ; i++){for(int k = i + 1; k < i + j; k++)dp[i][i + j] = min(dp[i][i + j],dp[i][k] + dp[k][i + j] + array[i + j] - array[i]);}printf("The minimum cutting is %d.\n",dp[0][n + 1]);
}
int main(){while(Input()){DP();}return 0;
}

一下是一个矩阵链乘的链接,感觉还不错:

http://blog.csdn.net/liufeng_king/article/details/8497607

这篇关于【UVA】10003-Cutting Sticks(动态规划、矩阵链乘)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146532

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节