当前位置:网站首页>UVa 10003 - Cutting Sticks(白书,区间DP)
UVa 10003 - Cutting Sticks(白书,区间DP)
2022-08-03 22:03:00 【51CTO】
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=12&problem=944&mosmsg=Submission+received+with+ID+17137424
思路:比较裸的区间DP吧,状态转移方程为dp[i][j]=min(dp[i][k]+dp[k][j])+a[j]-a[i],可以用四边形不等式进行优化
AC代码1:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const
int
inf
=
0x3f3f3f3f;
//1061109567
typedef
long
long
LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using
namespace
std;
int
a[
55],
dp[
55][
55];
int
main()
{
int
l;
while(
scanf(
"%d",
&
l)
&&
l)
{
memset(
dp,
inf,
sizeof(
dp));
int
n;
scanf(
"%d",
&
n);
a[
0]
=
0;
for(
int
i
=
1;
i
<=
n;
i
++)
scanf(
"%d",
&
a[
i]);
a[
n
+
1]
=
l;
for(
int
i
=
0;
i
<=
n;
i
++)
{
dp[
i][
i
+
1]
=
0;
}
for(
int
r
=
3;
r
<=
n
+
2;
r
++)
//注意这里的长度是n+2
{
for(
int
i
=
0;
i
<=
n
-
r
+
2;
i
++)
//注意这里i的取值范围
{
int
j
=
i
+
r
-
1;
for(
int
k
=
i
+
1;
k
<
j;
k
++)
{
if(
dp[
i][
j]
>
dp[
i][
k]
+
dp[
k][
j])
dp[
i][
j]
=
dp[
i][
k]
+
dp[
k][
j];
}
dp[
i][
j]
+=
a[
j]
-
a[
i];
//printf("%d %d %d\n",i,j,dp[i][j]);
}
}
printf(
"The minimum cutting is %d.\n",
dp[
0][
n
+
1]);
}
return
0;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
AC代码2:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const
int
inf
=
0x3f3f3f3f;
//1061109567
typedef
long
long
LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using
namespace
std;
int
a[
55],
dp[
55][
55];
int
main()
{
int
l;
while(
scanf(
"%d",
&
l)
&&
l)
{
memset(
dp,
inf,
sizeof(
dp));
int
n;
scanf(
"%d",
&
n);
a[
0]
=
0;
for(
int
i
=
1;
i
<=
n;
i
++)
scanf(
"%d",
&
a[
i]);
a[
n
+
1]
=
l;
for(
int
i
=
0;
i
<=
n;
i
++)
{
dp[
i][
i
+
1]
=
0;
}
for(
int
r
=
3;
r
<=
n
+
2;
r
++)
{
for(
int
i
=
0;
i
<=
n
-
r
+
3;
i
++)
//比上一个多算了一次,其实是没有必要的
{
int
j
=
i
+
r
-
1;
for(
int
k
=
i
+
1;
k
<
j;
k
++)
{
if(
dp[
i][
j]
>
dp[
i][
k]
+
dp[
k][
j])
dp[
i][
j]
=
dp[
i][
k]
+
dp[
k][
j];
}
dp[
i][
j]
+=
a[
j]
-
a[
i];
}
}
printf(
"The minimum cutting is %d.\n",
dp[
0][
n
+
1]);
//注意这里是dp[0][n+1]
}
return
0;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
边栏推荐
猜你喜欢

2022年全国职业院校技能大赛网络安全 B模块 任务十windows操作系统渗透测试 国赛原题

《QDebug 2022年7月》

用于流动质押和收益生成的 Web3 基础设施

21天打卡挑战学习MySQL——《Window下安装MySql》第一周 第三篇

nxp官方uboot移植到野火开发板PRO(修改LCD部分和网络部分)

D - Project Planning--二分

字节跳动软件测试岗,前两面过了,第三面HR天坑,结局透心凉...

CAS:1260586-88-6_Biotin-C5-Azide_Biotin-C5-Azide

距LiveVideoStackCon 2022 上海站开幕还有3天!

嵌入式系统:时钟
随机推荐
XSS线上靶场---Warmups
nxp官方uboot移植到野火开发板PRO(无任何代码逻辑的修改)
Kubernetes入门到精通-Operator 模式
4. Modular programming
决策树、GBDT、XGBOOST树的可视化
IO线程进程->线程同步互斥机制->day6
LyScript 实现应用层钩子扫描器
6. XML
从0到1看支付
东西向和南北向通信的统一
如何基于WPF写一款数据库文档管理工具(二)
Unification of east-west and north-south communications
B. Paranoid String
dataframe multi-level index replace index df.swaplevel(axis=1)
【进阶自动化测试】一文1000教你如何用Postman做接口自动化测试
CAS:908007-17-0_Biotin-azide_Biotin azide
CAS:1260586-88-6_Biotin-C5-Azide_Biotin-C5-Azide
深度学习和机器学习有什么区别?
JPA Native Query(本地查询)及查询结果转换
超级实用网站+公众号合集