博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOI1995 石子合并 DP+平行四边形优化
阅读量:6913 次
发布时间:2019-06-27

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

作者: hgz 发布时间: 2017-05-20 16:30 

题解

维护前缀和,枚举分割点k

dp[i][j]表示第i到第j堆石子合并的最优值,sum[i][j]表示第i到第j堆石子的总数量。
 
 
平行四边形优化
 
设m[i,j]表示动态规划的状态量。
m[i,j]有类似如下的状态转移方程:
m[i,j]=min{m[i,k]+m[k,j]}(i≤k≤j)

定义s(i,j)为函数m(i,j)对应的使得m(i,j)取得最大值的k值。

我们可以证明,s[i,j-1]≤s[i,j]≤s[i+1,j]
那么改变状态转移方程为:
m[i,j]=min{m[i,k]+m[k,j]}(s[i,j-1]≤k≤s[i+1,j])

记录最佳分割点point[i][j],k从point[i][j- 1]枚举到point[i + 1][j]即可

CODE

#include 
#include
#include
#include
using namespace std;typedef long long ll; ll pre[110], s[110];ll f[110][110];ll point[110][110];ll n; ll get_min_score(){ ll i, j, k; for (i = 1; i <= n; i++) f[i][i] = 0, point[i][i] = i; for (j = 1; j <= n; j++) { for (i = 1; i <= n - j; i++) { f[i][i + j] = INT_MAX; for (k = point[i][i + j - 1]; k <= point[i + 1][i + j]; k++) { int tmp = f[i][k] - pre[i - 1] + f[k + 1][i + j] + pre[i + j]; if (tmp < f[i][i + j]) { f[i][i + j] = tmp; point[i][i + j] = k; } } } } return f[1][n];} int main(){ ll i, j, k; ll global_min = INT_MAX; scanf("%lld", &n); for (i = 1; i <= n; i++) scanf("%lld", &s[i]); for (i = 1; i < n; i++) { swap(s[i], s[i + 1]); pre[0] = 0; for (k = 1; k <= n; k++) { pre[k] = pre[k - 1] + s[k]; } global_min = min(global_min, get_min_score()); swap(s[i], s[i + 1]); } printf("%lld\n", global_min); //system("pause"); return 0;}

 

 

 

 

问题 F: 石子合并(NOI1995)

时间限制: 1 Sec  内存限制: 128 MB

提交: 89  解决: 48

 

题目描述

在操场上沿一直线排列着 n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分。允许在第一次合并前对调一次相邻两堆石子的次序。

计算在上述条件下将n堆石子合并成一堆的最小得分和初次交换的位置。

输入

输入数据共有二行,其中,第1行是石子堆数n≤100;

第2行是顺序排列的各堆石子数(≤20),每两个数之间用空格分隔。

输出

输出合并的最小得分。

样例输入

3 2 5 1

样例输出

11

转载于:https://www.cnblogs.com/dancer16/p/6894771.html

你可能感兴趣的文章
用luasocket读取双色球中奖号码
查看>>
C#中ref和out的使用小结
查看>>
Extjs4 中的gird
查看>>
错排-HDU 2049 递推的应用
查看>>
参数化查询为什么能够防止SQL注入
查看>>
AlertDialog.Builder弹出对话框
查看>>
HDUOJ -----1686
查看>>
pomelo组件..
查看>>
[问题2014S03] 解答
查看>>
mybatis入门例子
查看>>
[LeetCode] Construct Binary Tree from Inorder and Postorder Traversal
查看>>
Sencha touch 初体验
查看>>
锋利的jQuery-1--解决jquery库和其他库的冲突
查看>>
SSH框架
查看>>
第1章 游戏之乐——小飞的电梯调度算法
查看>>
Codeforces Round #256 (Div. 2) C. Painting Fence 或搜索DP
查看>>
component to string 自定义窗体
查看>>
Atitit.收银系统模块架构attilax 总结
查看>>
hibernate(十)双向关联关系的CRUD
查看>>
hadoop学习;大数据集在HDFS中存为单个文件;安装linux下eclipse出错解决;查看.class文件插件...
查看>>