博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1880 [NOI1995]石子合并(区间DP)
阅读量:5325 次
发布时间:2019-06-14

本文共 1305 字,大约阅读时间需要 4 分钟。

嗯...

 

题目链接:https://www.luogu.org/problem/P1880

 

这道题特点在于石子是一个环,所以让a[i+n] = a[i](两倍长度)即可解决环的问题,然后注意求区间最小值的时候dp要初始化为一个很大的数...

 

AC代码:

1 #include
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 int dp1[205][205], dp2[205][205], sum[205], a[205]; 9 10 int main(){11 int n;12 scanf("%d", &n);13 for(int i = 1; i <= n; i++) {scanf("%d", &a[i]); a[i + n] = a[i];}14 for(int i = 1; i <= n * 2; i++) {sum[i] = sum[i - 1] + a[i];}15 for(int l = 1; l <= n; l++){16 for(int i = 1; i <= 2 * n; i++){17 int j = i + l;18 dp2[i][j] = 0x3f3f3f;// 求最小值初始化为很大 19 if(j > 2 * n) break;20 for(int k = i; k < j; k++){21 dp1[i][j] = max(dp1[i][j], dp1[i][k] + dp1[k + 1][j] + sum[j] - sum[i - 1]);22 dp2[i][j] = min(dp2[i][j], dp2[i][k] + dp2[k + 1][j] + sum[j] - sum[i - 1]);23 }24 }25 }26 int maxx = 0, minn = 0x3f3f;27 for(int i = 1; i <= n; i++){28 int j = i + n - 1;29 maxx = max(maxx, dp1[i][j]);30 minn = min(minn, dp2[i][j]);31 }32 printf("%d\n%d\n", minn, maxx);33 return 0;34 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11569196.html

你可能感兴趣的文章
iis配置问题
查看>>
hdu 5417 Victor and Machine
查看>>
人物-李彦宏:李彦宏
查看>>
.NETFramework:ConfigurationManager
查看>>
JSP-Runoob:JSP 点击量统计
查看>>
package-org.springframework.ui-interface:Model.class
查看>>
Java-MyBatis-杂项: MyBatis 中 in 的用法2
查看>>
WiFi direct 的相关特点
查看>>
数据结构-线段树
查看>>
HUD2647 Reward_反向建图拓扑排序
查看>>
BZOJ 3343 教主的魔法 分块
查看>>
白发长哪里是肝不好
查看>>
QT Graphics-View图元组使用
查看>>
利用反射调用方法时,处理ref,out参数需要注意的问题(转)
查看>>
【模板】一堆数论模板 [数论]
查看>>
webug4.0安装
查看>>
状态保存
查看>>
【模板】关于c++的代码模板
查看>>
SCU - 4117 - Discover
查看>>
Office DDE 攻击
查看>>