题目链接: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)的更多相关文章

  1. CSU 1592 石子合并 (经典题)【区间DP】

    <题目链接> 题目大意: 现在有n堆石子,第i堆有ai个石子.现在要把这些石子合并成一堆,每次只能合并相邻两个,每次合并的代价是两堆石子的总石子数.求合并所有石子的最小代价. Input ...

  2. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  3. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  4. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  5. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  6. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

  7. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  8. 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 ...

  9. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

随机推荐

  1. java进程卡死问题

    原文地址:http://stackoverflow.com/questions/28739600/jvm-hang-and-kill-3-jmap-failed tomcat进程出现了如下异常,并且卡 ...

  2. Yii框架 多数据库、主从、读写分离

    Yii是可以在配置文件里声明多个数据库连接,然后通过Yii::app()->db1,Yii::app()->db2...来访问它们,并且也实现了更高级(自动)的主从数据库功能. 最近因为一 ...

  3. java学习之运算符

    学习完了变量+常量,现在只能简单的声明变量+赋值+打印变量. 但是程序要做的就是去处理数据,把原本散乱的数据,处理成有意义的数据,供我们来使用,这就涉及到了运算符的应用. 算数运算符常用的种类: 加法 ...

  4. centos qt5,PyQt5 installation

    一.SIP http://www.riverbankcomputing.com/software/sip/download   二.Centos6.5 qt 安装 1,centos linux系统必须 ...

  5. 实战weblogic集群之创建节点和集群

    一.启动weblogic,访问控制台 weblogic的domain创建完成后,接下来就可以启动它,步骤如下: $ cd /app/sinova/domains/base_domain/bin $ . ...

  6. 数位DP:SPOJ KPSUM - The Sum

    KPSUM - The Sum One of your friends wrote numbers 1, 2, 3, ..., N on the sheet of paper. After that ...

  7. UVaLive5031 Graph and Queries(时光倒流+名次树)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20332 [思路] 时光倒流+名次树(rank tree). 所谓“ ...

  8. 转载:linux capability深入分析

    转至http://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html 一)概述:  1)从2.1版开始,Linux内核有了能力(capabili ...

  9. OpenGL中glPushMatrix和glPopMatrix的原理

    glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...

  10. SVN Checkout 不包括源文件夹根目录(转)

    SVN Checkout 不包括源文件夹根目录,比如我要checkout   trunk/ 下面的所有文件,但是不包括trunk 文件夹 我们可以在svn文件夹后面打个空格,在加个“.”就行了 eg: ...