NYOJ 737 (石子合并)
该题是一道DP题,核心思想如下:
某个区间一定是这个区间内的某两个子区间合成的(这两个子区间互补,即这两个区间加起来等于大区间),
所以我们枚举所有的情况,取个最大值即可。因为最初是从2堆石子开始无法选择,到数量大了就可以择优,体现出DP的优势。
DP[ i ] [ j ]表示 i 到 j 区间的最优合并值。
则由上述思想转移方程如下:
dp[ i ][ j ] = min( dp[ i ][ j ], dp[ i ][ k ] + dp[k + 1][ j ] + sum[ i ][ j ] ) (i <= k <= j - 1)。
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int n, s[][], a[], f[][]; int main()
{
while(scanf("%d", &n) != EOF)
{
memset(s, , sizeof s );
memset(a, , sizeof a );
memset(f, , sizeof f );
for(int i = ; i <= n; i++)
scanf("%d", &a[i]);
for(int i = ; i <= n; i++)
{
for(int j = i; j <= n; j++)
{
f[i][j] = 0x3f3f3f3f;//初值赋无限大
for(int k = i; k <= j; k++)
s[i][j] = s[i][j] + a[k];
}
}
for(int i = ; i <= n; i++)
f[i][i] = ;//自身初值为0
for(int i = ; i < n; i++)
{
for(int j = ; j <= n-i; j++)
{
for(int k = j; k <= i + j - ; k++)
{
if(f[j][i+j] > f[j][k] + f[k+][i+j]+s[j][i+j])
f[j][i+j] = f[j][k] + f[k+][i+j]+s[j][i+j];
}
printf("f[%d][%d] = %d\n", j, i+j, f[j][i+j]);
}
}
printf("%d\n", f[][n]);
}
return ;
}
NYOJ 737 (石子合并)的更多相关文章
- nyoj 737 石子合并 http://blog.csdn.net/wangdan11111/article/details/45032519
http://blog.csdn.net/wangdan11111/article/details/45032519 http://acm.nyist.net/JudgeOnline/problem. ...
- nyoj 737 石子合并(一)。区间dp
http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你 ...
- nyoj 737 石子合并 经典区间 dp
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆 ...
- 题解报告:NYOJ #737 石子合并(一)(区间dp)
描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值 ...
- nyoj 737 石子合并(区间DP)
737-石子合并(一) 内存限制:64MB 时间限制:1000ms 特判: No通过数:28 提交数:35 难度:3 题目描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为 ...
- NYOJ 737 石子合并(一)
分析: 本题为区间型动态规划,dp[i][j] 表示从第 i 堆合并到第 j 堆的最小代价, sum[i][i] 表示第 i 堆到第 j 堆的石子总和,则动态转移方程: dp[i][j] = min( ...
- NYOJ 737 石子合并(一)
题意 排成一排的石子,每次合并相邻两堆并由一定的代价,求合并成一堆的最小代价 解法 区间dp 枚举长度 dp[i,j]表示合并石子堆编号从i到j为一堆所需的最小代价(这个题目的代价是sum(i..j) ...
- ny737 石子合并(一) 总结合并石子问题
描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子合并 ...
- NYOJ 石子合并(一) 区间dp入门级别
描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价 ...
- [NYIST737]石子合并(一)(区间dp)
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 很经典的区间dp,发现没有写过题解.最近被hihocoder上几道比赛题难住了 ...
随机推荐
- SCP-bzoj-1057
项目编号:bzoj-1057 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 首先枚举最左上角的点(记为(1,1))是黑点还是白点,这样就可以把与(1,1)不在同一对角线系的格点颜色翻转(形式 ...
- jQuery函数API,各版本新特性汇总
jQuery API 速查表 选择器 基本 #id element .class * selector1,selector2,selectorN 层级 ancestor descendant pare ...
- TP5.0 where数组高级查询
多条件模糊查询多条件比较查询使用数组可以方便得将一些比较复杂的查询条件 , 组合到一个数组之内 如以下数据库查询 $subjectList = Db::name('user_apply') -> ...
- KEIL Code RO-data RW-data ZI-data 【转】
来自:http://jinyong314.blog.163.com/blog/static/30165742201052225415901/ 字节 8位半字 16位字 32位 Code, RO-d ...
- Webx.0-Web3.0:Web3.0
ylbtech-Webx.0-Web3.0:Web3.0 Web3.0只是由业内人员制造出来的概念词语,最常见的解释是,网站内的信息可以直接和其他网站相关信息进行交互,能通过第三方信息平台同时对多家网 ...
- 如何将Vue项目部署到Nginx 服务器中
https://blog.csdn.net/qq_35366269/article/details/91385689
- kafka 简单安装以及java小demo
文章目录 第1步,下载解压 kafka: 第2步,运行 kafka: 第3步,创建topic 第4步,生产者发送消息 第5步,消费者接收消息 使用 java 客户端 kafka 0.8.0版本demo ...
- 【单例模式】懒汉式的线程安全问题 volatile的作用
原文链接:https://blog.csdn.net/Activity_Time/article/details/96496579 ****** 1. 懒汉式的Java实现 public class ...
- 算法刷题笔记-stack-四则运算
题目描述: 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输入: &qu ...
- mysql 个人博客应用的建表和相关查询
一.建表 用户表tb_user create table if not exists tb_user( user_id int auto_increment, ) not null, user_pas ...