CCF(压缩编码):动态规划+平行四边形优化

压缩编码

201612-4

#include<bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
const int maxn=1003;
int n;
int sum[maxn];
int dp[maxn][maxn];
const int INF=0X3F3F3F3F;
//dp[i][j]=min(dp[i][k]+dp[k][j]+sum[j]-sum[i-1])
int main() {
    //freopen("in1.txt","r",stdin);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    int x;
    sum[0]=0;
    for(int i=1;i<=n;i++){
        cin>>x;
        sum[i]=sum[i-1]+x;
    }
    memset(dp,INF,sizeof(dp));
    for(int i=1;i<=n;i++){
        dp[i][i]=0;
    }
    for(int i=n;i>=1;i--){
        for(int j=i+1;j<=n;j++){
            for(int k=i;k<j;k++){
                dp[i][j]=min(dp[i][j],(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]));
            }
        }
    }
    cout<<dp[1][n]<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/GarrettWale/p/11521214.html

时间: 2024-11-11 19:37:36

CCF(压缩编码):动态规划+平行四边形优化的相关文章

Gym 100829S_surf 动态规划的优化

题目大意是,非你若干个任务,任务分别对应开始时间.预期收益.持续时间三项指标,让你从中选择一个受益最大的方案(没有开始时间相同的任务). 于是,标准状态转移方程应当为,设DP[K]为选择了前K个任务的最大收益,后面转移为DP[K+1]=MAX且能够共存的(DP[I]):很容易想到N^2的暴力更新,但是这题数量太大,会炸得连渣都不剩.于是需要优化到较低的数量级(比如NLOGN) 注意到,我们也许不用对某个任务来选取前K个的最大值,不容易想到优化但是想想刘汝佳同志的话--不方便直接求解的时候想想更新

蓝桥杯:合并石子(区间DP+平行四边形优化)

http://lx.lanqiao.cn/problem.page?gpid=T414 题意:…… 思路:很普通的区间DP,但是因为n<=1000,所以O(n^3)只能拿90分.上网查了下了解了平行四边形优化:地址. 但是看不懂. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const LL INF = 100000000000000000LL; 5 LL dp[1010][101

区间动规平行四边形优化

平行四边形优化,是一种在一类区间动规中减少时间复杂度的方法. 有方程:m(i,j)=min(m(i,k)+m(k+1,j)+w(i,j)),s(i,j)为最优点取到值. 公式:如果有w(i, j)+w(i′, j′)≤w(i′, j)+w(i, j′) 那么我们称函数 w 满足四边形不等式. 就有s(i, j)≤s(i, j + 1)≤s(i + 1, j + 1) 证明思路如下: 我们先要证明:m(i,j)+m(i′,j′)≤m(i′,j)+m(i,j′),i≤i′< j≤ j′ . 分部证明

$Dynamic Planning Optimization$ 关于动态规划的优化方案(%$\color{red}{rqy}$)

关于动态规划的优化方案(%\(\color{red}{rqy}\)) 1.单调队列 单调队列是一种具有单调性的队列,其中的元素全部按照递增或者递减的顺序排列,就比如下面这个递减队列. 假如说我们要在队尾加入一个\(5\),那么我们入队的步骤就是这样的: 发现队尾\(1\),(q[tail]),\(1<5\),则将1退出(tail--) 发现队尾\(2\),(q[tail]),\(2<5\),则将2退出(tail--) 发现队尾\(3\),(q[tail]),\(3<5\),则将3退出(t

动态规划(斜率优化):BZOJ 1010 【HNOI2008】 玩具装箱

玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8218  Solved: 3233[Submit] Description P 教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维 容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的. 同时如果一个一维

NYOJ 737 石子合并(一) (区间DP+平行四边形优化)

题目地址:NYOJ 737 定义状态dp [ i ] [ j ]为从第i个石子到第j个石子的合并最小代价. 没有优化的代码如下:耗时248ms. #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include

Evensgn的OI学习笔记(一)——动态规划及其优化

Author : Evensgn Date : 2014-12-08 蒟蒻也要写笔记啦~ (1)矩阵乘法优化DP 矩阵乘法: 一个 a*b 的矩阵 M1 与一个 b*c 的矩阵 M2 相乘,得到一个 a*c 的矩阵 M3. M3[i][j] = sigma(M1[i][k] * M2[k][j])      ( i <= a; j <= c; k <= b ) M3 的一个元素 M3[i][j] 是矩阵 M1 的第 i 行与 M2 的第 j 列的每一个对应元素乘积的和. 注意:矩阵 M1

动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割

Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长 度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的 序列一一也就是一开始得到的整个序列): 2.选择一个位置,并通过这个位置将这个序列分割成连续的两个非空的新 序列. 每次进行上述步骤之后,小H将会得到一定的分数.这个分数为两个新序 列中元素和的乘积.小H希望选择一种最佳的分割方案,使得

BZOJ1911 [Apio2010]特别行动队 - 动态规划 - 斜率优化

欢迎访问~原文出处--博客园-zhouzhendong&AK 去博客园看该题解 题目传送门 题意概括 把一个整数序列划分成任意连续的段,使得划分出来的每一段的价值和最大. 对于某一段,价值的计算公式为 V=ax^2+bx+c,其中 x 为当前段的数值和. 题解 这题是博主大蒟蒻的第一道斜率优化DP题-- C++:while (1) 懵逼++; Pascal:while (true) do inc(懵逼); 本题首先一看就是 DP 题. 但是一看 1<=n<=1000000,-5<