【dp】区间规划类问题 jzoj1290 关灯

状态多了一维的区间规划....注意处理好每一步的耗能

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int f[2005][2005][3];
int sum[2000006];
int stdx[10000];
int a[1000000];
int x[2005][2005];
int s[2005][2005];
int main()
{
    int n,st;
    cin>>n>>st;
    for(int i=1;i<=n;i++)
    {
        cin>>stdx[i]>>a[i];
        a[i]+=a[i-1];
    }
    for(int i=1;i<=n;i++)
        for(int u=i;u<=n;u++)
            x[i][u]=a[n]-a[u]+a[i-1];
        memset(f,10,sizeof(f));
        f[st][st][0]=0;
        f[st][st][1]=0;
    for(int p=2;p<=n;p++)
        for(int i=1;i<=n;i++)
        {
            int j=i+p-1;
            if(j>n)break;
            f[i][j][0]=min(f[i+1][j][0]+(stdx[i+1]-stdx[i])*x[i+1][j],f[i+1][j][1]+(stdx[j]-stdx[i])*x[i+1][j]);
            f[i][j][1]=min(f[i][j-1][0]+(stdx[j]-stdx[i])*x[i][j-1],f[i][j-1][1]+(stdx[j]-stdx[j-1])*x[i][j-1]);
        }
        int maxx;
        maxx=min(f[1][n][0],f[1][n][1]);
        cout<<maxx<<endl;
}
时间: 2024-10-20 09:51:15

【dp】区间规划类问题 jzoj1290 关灯的相关文章

HDU 2836 (离散化DP+区间优化)

Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2836 题目大意:计算序列有多少种组合,每个组合至少两个数,使得组合中相邻两个数之差不超过H,序列有重复的数.MOD 9901. 解题思路: 朴素O(n^2) 以样例1 3 7 5为例,如果没有重复的数. 设dp[i]前n个数的方案数,初始化为1. 那么fo

P1220 关路灯(区间规划)

题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关灯时也都是尽快地去关,但是老张不知道怎样去关灯才能够最节省电.他每天都是在天亮时首先关掉自己所处位置的路灯,然后可以向左也可以向右去关灯.开始他以为先算一下左边路灯的总功率再算一下右边路灯的总功率,然后选择先关掉功率大的一边,再回过头来关掉另一边

codeforces Good bye 2016 E 线段树维护dp区间合并

题目大意:给你一个字符串,范围为'0'~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问,最少删除多少个字符,使得串中符合ugly串? 思路:定义dp(i, j),其中i=5,j=5,因为只需要删除2016当中其中一个即可,所以一共所需要删除的字符和需要的字符为20176,因此i和j只要5就够了. 然后转移就是dp(i,i) = 0, 如果说区间大小为1的话,那么如果是2017中的一个,那么就是dp(pos, pos+1) = 0, dp(pos,pos) =

HDU5900-QSC and Master-区间DP+区间覆盖DP

地址 http://acm.hdu.edu.cn/showproblem.php?pid=5900 2016ICPC沈阳赛区网络赛 题意:一个队列,每个点有key[i]和value[i],位置相邻且key不互质的两个点可以被取走,取走后,剩下点自动连接起来. 问取走的value和最大 题解:1.对于所有的区间,用区间DP求出能否 整个 区间取走 枚举区间长度 对于[s,e] 的区间,要么由两个比这短的区间拼凑而成,要么s和e可以不互质,且[s+1,e-1]可以取走,特判长度为2的时候. 2.对于

[BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案

题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这样不大好求,我们将这个式子取$ln$,变成$ln\ ans=\frac{1}{c}\sum_{i=1}^{c}ln\ v_{i}$. 这显然是一个分数规划,每次二分一个答案$mid$,将每个串的权值都减去$mid$,那么只需要求最大价值是否大于$0$即可. 剩下的问题就是一个在$AC$自动机上的$D

HDU-4625 JZPTREE (树上dp,第二类斯特林数)

题目链接:HDU-4625 JZPTREE 题意 给出$n$个结点的一棵树,对每一个点$x$求所有点到$x$的距离的$k$次方之和.$1\leq n\leq 50000, 1\leq k\leq 500$. 思路 用$Tree_x$表示这棵树以$x$为根,$f(x,k)$表示所有点到$x$的距离的$k$次方之和,$dis(x,y)$表示结点$x$和$y$之间的距离,题意即求:$$f(x,k) = \sum_{y\in Tree_x}{dis(x,y)^k} \tag{1}$$我们要将之转换为能在

【NOIP模拟_54测试】【并查集】【二进制】【搜索】【区间序列类】

第一题 Mushroom的序列 大意: 给一个序列,求一段连续最长区间满足:最多改变一个数,使得区间是严格的上升子序列. 解: 直接扫描一遍,记一个最长上升子序列编号.然后从每一个编号为1 的点来判断是否可以将两个序列合并,有两种情况,讨论需要注意多种子情况...我可能想的比较复杂,所以第一遍写的时候少考虑了一些相等的情况,就WA 了一个点. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #i

URAL 1776 Anniversary Firework 概率dp+区间dp

A - Anniversary Firework Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice URAL 1776 Appoint description:  System Crawler  (2016-05-06) Description Denis has to prepare the Ural State University 90th

判断当前日期是否在[startDate, endDate]区间工具类

/** * 判断当前日期是否在[startDate, endDate]区间 * * @param startDate 开始日期 * @param endDate 结束日期 * @author jqlin * @return */ public static boolean isEffectiveDate(Date startDate, Date endDate){ if(startDate == null || endDate == null){ return false; } long cur