• BZOJ 2037 区间DP


    跟POJ 3042是一个类型的http://blog.csdn.net/qq_31785871/article/details/52954924
    思路:
    先排个序 (把初始位置也插进去)
    f[i][j]表示从第i个到第j个之间的蛋都被收完了
    f[i][j][0]表示在地点i f[i][j][1]表示在地点j
    维护一个sumv数组 是v的前缀和
    f[i][j][0]=max(f[i+1][j][0]-(node[i+1].x-node[i].x)*(sumv[n]-sumv[j]+sumv[i]),
    f[i+1][j][1]-(node[j].x-node[i].x)*(sumv[n]-sumv[j]+sumv[i])),
    f[i][j][1]=max(f[i][j-1][0]-(node[j].x-node[i].x)*(sumv[n]-sumv[j-1]+sumv[i-1]),
    f[i][j-1][1]-(node[j].x-node[j-1].x)*(sumv[n]-sumv[j-1]+sumv[i-1]));

    最后加上所有的y之和就好啦

    注意把数组付上初值!!@某人

    //By SiriusRen
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n,x0,sumy,sumv[1005],f[1005][1005][2];
    struct Node{int x,y,v;}node[1005];
    bool cmp(Node a,Node b){return a.x<b.x;}
    int main(){
        scanf("%d%d",&n,&x0);
        for(int i=1;i<=n;i++)scanf("%d",&node[i].x);
        for(int i=1;i<=n;i++)scanf("%d",&node[i].y),sumy+=node[i].y;
        for(int i=1;i<=n;i++)scanf("%d",&node[i].v);
        node[++n].x=x0;
        sort(node+1,node+1+n,cmp);
        for(int i=1;i<=n;i++){
            if(node[i].x!=x0)f[i][i][0]=f[i][i][1]=0xcfffffff;
            sumv[i]=sumv[i-1]+node[i].v;
        }
        for(int i=n;i;i--)
            for(int j=i+1;j<=n;j++)
                f[i][j][0]=max(f[i+1][j][0]-(node[i+1].x-node[i].x)*(sumv[n]-sumv[j]+sumv[i]),
                f[i+1][j][1]-(node[j].x-node[i].x)*(sumv[n]-sumv[j]+sumv[i])),
                f[i][j][1]=max(f[i][j-1][0]-(node[j].x-node[i].x)*(sumv[n]-sumv[j-1]+sumv[i-1]),
                f[i][j-1][1]-(node[j].x-node[j-1].x)*(sumv[n]-sumv[j-1]+sumv[i-1]));
        printf("%.3lf
    ",0.001*(max(f[1][n][0],f[1][n][1])+sumy));
    }

    这里写图片描述

  • 相关阅读:
    SpringBoot多数据源:动态数据源
    cron 表达式
    6种@Transactional注解的失效场景
    spring boot 整合mybatis 的xml版本
    MySQL函数大全 及用法示例
    后端必备 Nginx 配置
    详解SpringBoot应用跨域访问解决方案
    Lombok使用
    前端必备 Nginx 配置
    随便写写插入排序
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532200.html
Copyright © 2020-2023  润新知