tyvj 1055 区间dp
描述
输入格式
第二行N个数,表示每堆沙子的质量。 <=1000
输出格式
测试样例1
输入
4
1 3 5 2
输出
22
题意:n堆沙子排成一排 每次只能合并相邻的两堆 并且的合并的代价为两堆沙子的数量之和
最终合并为一堆,问合并过程中代价和的最小值。
题解:dp[i][j] 表示i~j这个区间内合并为一堆的代价和的最小值。
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
将i~j分解为一个子问题,枚举k(分解点)取最优的方法 并且要加上sum[j]-sum[i-1](最终的状态为合并成一堆)
特别注意边界的处理 dp[i][i+1]=a[i]+a[i+1];
若i==j dp[i][j]=0;
或许递归的写法更好,但是这样更便于理解;
/******************************
code by drizzle
blog: www.cnblogs.com/hsd-/
^ ^ ^ ^
O O
******************************/
//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#include<cmath>
#define ll __int64
#define PI acos(-1.0)
#define mod 1000000007
using namespace std;
int n;
int a[];
int sum[];
int dp[][];
int main()
{
while(scanf("%d",&n)!=EOF)
{
sum[]=;
memset(dp,,sizeof(dp));
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];//前缀和
}
for(int i=; i<=n; i++)
for(int j=i; j<=n; j++)
{
dp[i][j]=mod;//初始化
if(i==j)//边界处理
dp[i][j]=;
}
for(int i=; i<n; i++)
dp[i][i+]=a[i]+a[i+];//边界处理
for(int i=n; i>=; i--)
{
for(int j=i+; j<=n; j++)
{
for(int k=i; k<j; k++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+][j]+sum[j]-sum[i-]);
}
}
cout<<dp[][n]<<endl;
}
return ;
}
tyvj 1055 区间dp的更多相关文章
- BZOJ 1055 区间DP
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1144 Solved: 668[Submit][Statu ...
- bzoj1055玩具取名——区间DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间DP,注意初始化!! 因为没记忆化,TLE了一晚上,区间DP尤其要注意不重复递归! ...
- bzoj 1055 [HAOI2008]玩具取名(区间DP)
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1258 Solved: 729[Submit][Statu ...
- Bzoj 1055: [HAOI2008]玩具取名 (区间DP)
Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...
- tyvj 1198 矩阵连乘——区间dp
tyvj 1198 矩阵连乘 题目描述 一个n*m矩阵由n行m列共n*m个数排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算 ...
- 1055. [HAOI2008]玩具取名【区间DP】
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替, ...
- BZOJ 1055 玩具取名(区间DP)
很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...
- Bzoj 1055 玩具取名(区间DP)
题面 题解 字符很麻烦,不妨用数字代替(比如1代表'W') const char c[5] = {0, 'W', 'I', 'N', 'G'}; 接着,像这种两个子串可以合并成另一个子串的题可以考虑区 ...
- 区间dp复习 之 tyvj 1198 矩阵连乘
题目描述 一个\(n*m\)矩阵由\(n\)行\(m\)列共\(n*m\)个数排列而成.两个矩阵\(A\)和\(B\)可以相乘当且仅当\(A\)的列数等于\(B\)的行数.一个\(N*M\)的矩阵乘以 ...
随机推荐
- js正则表达式和replace
javascript中replace与正则表达式 replace()最简单的算是能力就是简单的字符替换.示例代码如下: <script language="javascript&quo ...
- PowerMock使用遇到的一些问题
首先使用PowerMock Mock对象如果不成功的话首先要检查在测试类上是否有这两个声明@RunWith(PowerMockRunner.class) ...
- sqlite多表关联update
sqlite数据库的update多表关联更新语句,和其他数据库有点小不一样 比如:在sql server中: 用table1的 id 和 table2的 pid,关联table1 和 table2 , ...
- C#保存登录用户名供其他页面调用
一.保存登录用户名供其他页面调用 步骤: (1)项目自带的Program.cs,类方法里定义登录的用户名为全局变量loginid,这样整个项目都可以调用它 static class Program { ...
- [转载]Matrix类的使用
2013-12-18 11:31:00 转载自: http://www.cnblogs.com/mmy0925/archive/2013/01/22/2871009.html 在Android中,对图 ...
- fragment 添加menu
http://bbs.51cto.com/thread-1091458-1-1.html 有详解 @Override public void onCreate(Bundle savedInstance ...
- Oracle 中批量导入大量测试数据的方法
执行如下批处理命令: declare maxrecords constant int := 100000; i int := 1;begin for i in 1 .. 20000 loop ...
- JSP重定向传递参数
我一个JSP程序,要实现前台提交数据给后台处理后,后台jsp自动跳转到另一个jsp页面,这种方式也叫重定向,重定向的方法有多种,暂时我试过的并且能成功的有两个: 一种是用 response.sendR ...
- hdu 2052
PS:竟然一次AC....惊喜...注意每个实例后跟一个空行.. 学到一个快速清空数组的用法...memst函数. memst(void *s,char a,sizeof n) 把 s里面的前n个 ...
- 让Tomcat支持中文文件名
--参考链接:http://blog.chinaunix.net/uid-26284395-id-3044132.html 解决问题的核心在于修改Tomcat的配置,在Server.xml文件中添加一 ...