CSU 1616: Heaps(区间DP)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1616
1616: Heaps
Time Limit: 2 Sec Memory Limit: 128 MB
Submit:
48 Solved: 9
[Submit][Status][Web
Board]
Description
Zuosige always has bad luck. Recently, he is in hospital because of
pneumonia. While he is taking his injection, he feels extremely bored. However,
clever Zuosige comes up with a new game.
Zuosige knows there is a typical problem called Merging Stones. In the
problem, you have N heaps of stones and you are going to merging them into one
heap. The only restriction is that you can only merging adjacent heaps and the
cost of a merging operation is the total number of stones in the two heaps
merged. Finally, you are asked to answer the minimum cost to accomplish the
merging.
However, Zuosige think this problem is too simple, so he changes it. In his
problem, the cost of a merging is a polynomial function of the total number of
stones in those two heaps and you are asked to answer the minimum
cost.
Input
The first line contains one integer T, indicating the number of test
cases.
In one test case, there are several lines.
In the first line, there
are an integer N (1<=N<=1000).
In the second line, there are N
integers. The i-th integer si (1<=si<=40) indicating
the number of stones in the i-th heap.
In the third line, there are an
integer m (1<=m<=4).
In the forth line, there are m+1 integers
a0, … , am. The polynomial function is P(x)=
(a0+a1*x+a2*x2+…+am*xm).
(1<=ai<=5)
Output
For each test case, output an integer indicating the answer.
Sample Input
1
5
3 1 8 9 9
2
2 1 2
Sample Output
2840 题目大意:就是原始的石子合并的问题,相同的部分就不多介绍了,不同的便是在合并石子时,所消耗的费用不是两堆石子的总数,而是把总数代入公式:P(x)= (a0+a1*x+a2*x2+…+am*xm),同时题目也给出了a0--am的数值; 解题思路:解法就是普通的的区间DP算法,但是在做的时候老是超时,最后还是在学长的指导下,明白在第三重循环是可以不全循环,而是从上一次的两个dp中的断点之间找,并且预处理出从0到石子最大值数的带入公式的结果。唉,自己果然还是太水,改了这么久。。。。。,,看看我的备注就懂了。。心酸啊T^T
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; #define ll long long //const long long MAX=0xfffffffffffffff; ll num[],nmul[]; //nmul:储存预处理的结果
ll dp[][],mm[];
ll snum[]; //记录各数字的和
int kk[][]; //记录上一层次的断点 ll Pow(ll a,int k)
{
ll s=;
for(int i=; i<=k; i++)
s*=a;
return s;
} void Mul(int n,int m)
{
for(int i=;i<=snum[n-];i++)
{
nmul[i]=;
for(int j=;j<=m;j++)
nmul[i]+=mm[j]*Pow(i,j);
}
} int main()
{
int t,n,m;
/*for(int i=0; i<=40005; i++)
{
for(int j=0; j<=4; j++)
dd[i][j]=Pow(i,j);
}*/
scanf("%d",&t);
while(t--)
{
//snum[0]=0;
//memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=; i<n; i++)
{
scanf("%lld",&num[i]);
if(i==)
snum[i]=num[i];
else
snum[i]=snum[i-]+num[i];
}
scanf("%d",&m);
for(int i=; i<=m; i++)
scanf("%lld",&mm[i]);
Mul(n,m);
for(int i=; i<n; i++)
dp[i][i]=,kk[i][i]=i;
for(int l=; l<=n; l++)
{
for(int s=; s<n-l+; s++)
{
int e=s+l-;
ll ss=1e63; //一定要定义成最大值
for(int k=kk[s][e-]; k<=kk[s+][e]; k++) //从两个断点之间找
{
if(ss>dp[s][k]+dp[k+][e])
{
ss=dp[s][k]+dp[k+][e];
kk[s][e]=k;
}
//ss=dp[s][k]+dp[k+1][e]>ss?ss:dp[s][k]+dp[k+1][e];
}
/*ll sum=0,sss=0;
for(int k=s; k<=e; k++)
sum+=num[k];
for(int k=0; k<=m; k++)
sss+=mm[k]*Pow(sum,k);*/
dp[s][e]=ss+nmul[snum[e]-snum[s-]];;
//printf("s=%d,e=%d,dp=%lld\n",s,e,dp[s][e]);
}
}
printf("%lld\n",dp[][n-]);
}
return ;
}
CSU 1616: Heaps(区间DP)的更多相关文章
- CSU 1592 石子合并 (经典题)【区间DP】
<题目链接> 题目大意: 现在有n堆石子,第i堆有ai个石子.现在要把这些石子合并成一堆,每次只能合并相邻两个,每次合并的代价是两堆石子的总石子数.求合并所有石子的最小代价. Input ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- BZOJ 1260&UVa 4394 区间DP
题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...
- 区间dp总结篇
前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...
随机推荐
- bzoj2588
一开始一看树上的操作,就无脑写了树链剖分+主席树 然后果断T了,因为树链剖分+主席树必然带来两个log的复杂度 而且树链剖分复杂度还比较大…… 后来发现其实没必要,在这道题,我们可以直接利用主席树维护 ...
- oracle 表查询(2)
使用逻辑操作符号 问题:查询工资高于500 或者是岗位为MANAGER 的雇员,同时还要满足他们的姓名首字母为大写的J? or job = 'MANAGER') and ename LIKE 'J%' ...
- 控件treeview使用
一:实现功能,获得选中节点,在选中节点下添加节点,折叠,展开,删除,得到选中节点下checked项,选中根节点其下节点也选中,图标.上图 二:相关代码 using System; using Syst ...
- HDOJ(HDU) 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
Problem Description 当抢救人员发现她的时候,她已经死了,是被垮塌下来的房子压死的,透过那一堆废墟的的间隙可以看到她死亡的姿势,双膝跪着,整个上身向前匍匐着,双手扶着地支撑着身体,有 ...
- 汉洛塔递归实现的思考(C语言)
汉洛塔是古印度神话产生的智力玩具,他的玩法是,有三个柱子分别为A,B,C,A柱上面有n个盘子上面小下面大堆叠放在一起,现在要求激将A柱上的盘子全部移到C柱上面,并且一次只能移动一个盘子,必须是小盘在大 ...
- 暴力求解——除法 Division,UVa 725
Description Write a program that finds and displays all pairs of 5-digit numbers that between them u ...
- Android吧数据保存成xml文件
public class MainActivity extends Activity { private List<Person> persons; @Override protected ...
- Teacher YYF - POJ 3746(打表........)
1.名词和介词可以被用作主语或宾语 名词->n 介词->pron 2.当使用名词时,必须有冠词在它前面 n+art(冠词) 3.名词可以被一个形容词修饰,动词可以被一个副词修饰 adj+ ...
- Python算法之---冒泡,选择,插入排序算法
''' Created on 2013-8-23 @author: codegeek ''' def bubble_sort(seq): for i in range(len(se ...
- Android的minSdkVersion,targetSdkVersion,maxSdkVersion
参考http://developer.android.com/guide/topics/manifest/uses-sdk-element.html API Level 是一个整型值,表示Androi ...