博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1880 石子合并
阅读量:7254 次
发布时间:2019-06-29

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

经典水题.......

断环为链长度乘二,求前缀和区间DP。

1 #include 
2 #include
3 #include
4 #define int long long 5 const int N = 210; 6 7 int f[N][N], sum[N]; 8 9 main() {10 int n;11 scanf("%lld", &n);12 for(int i = 1; i <= n; i++) {13 scanf("%lld", &sum[i]);14 sum[n + i] = sum[i];15 }16 memset(f, 0x3f, sizeof(f));17 for(int i = 1; i <= n << 1; i++) {18 sum[i] += sum[i - 1];19 f[i][i] = 0;20 }21 22 23 for(int len = 2; len <= n; len++) {24 for(int l = 1; l + len - 1 <= n << 1; l++) {25 int r = l + len - 1;26 for(int k = l; k < r; k++) {27 f[l][r] = std::min(f[l][r], f[l][k] + f[k + 1][r] + sum[r] - sum[l - 1]);28 }29 }30 }31 32 int ans = 0x3f3f3f3f3f3f3f3f;33 for(int i = 1; i <= n; i++) {34 ans = std::min(ans, f[i][i + n - 1]);35 }36 printf("%lld\n", ans);37 38 memset(f, 0, sizeof(f));39 for(int len = 2; len <= n; len++) {40 for(int l = 1; l + len - 1 <= n << 1; l++) {41 int r = l + len - 1;42 for(int k = l; k < r; k++) {43 f[l][r] = std::max(f[l][r], f[l][k] + f[k + 1][r] + sum[r] - sum[l - 1]);44 }45 }46 }47 ans = 0;48 for(int i = 1; i <= n; i++) {49 ans = std::max(ans, f[i][i + n - 1]);50 }51 printf("%lld", ans);52 return 0;53 }
AC代码

这里用了个define int long long的骚操作,不推荐,可能爆0。

转载于:https://www.cnblogs.com/huyufeifei/p/9600950.html

你可能感兴趣的文章
C语言文件操作函数大全(超详细)
查看>>
sql语句
查看>>
log4j配置
查看>>
安装程序无法创建新的系统分区
查看>>
SpringMVC返回json的问题
查看>>
[LOJ] 分块九题 1
查看>>
DOM
查看>>
C++的特殊工具与技术
查看>>
性能测试方案和性能测试报告小结
查看>>
Springmvc的原理和业务处理
查看>>
【Android】一步实现防重复点击问题
查看>>
网络爬虫的基本实现步骤
查看>>
ajax
查看>>
POJ 2777 线段树
查看>>
python的十进制与任意进制的转换
查看>>
HTTP协议中GET和POST方法的区别
查看>>
malloc calloc 和 realloc
查看>>
ATL中对IDocHostUIHandler的封装
查看>>
python - work4
查看>>
MaskedTextBox
查看>>