zoukankan      html  css  js  c++  java
  • POJ 3042 区间DP(费用提前计算相关的DP)

    题意:
    这里写图片描述
    这里写图片描述

    思路:
    f[i][j][1]表示从i到j的区间全都吃完了 现在在j点 变质期最小是多少
    f[i][j][0]表示从i到j的区间全都吃完了 现在在i点 变质期最小是多少
    f[i][j][0]=min(f[i+1][j][0]+(s[i+1]-s[i])(n-j+i),f[i+1][j][1]+(s[j]-s[i])(n-j+i));
    f[i][j][1]=min(f[i][j-1][1]+(s[j]-s[j-1])(n-j+i),f[i][j-1][0]+(s[j]-s[i])(n-j+i));
    最后min(f[1][n][0],f[1][n][1])就是答案啦

    //By SiriusRen
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n,l,rec,s[1005],f[1005][1005][2];
    int main(){
        scanf("%d%d",&n,&l);
        for(int i=1;i<=n;i++)scanf("%d",&s[i]);
        s[++n]=l;
        sort(s+1,s+1+n);
        for(int i=1;i<=n;i++)
            if(s[i]==l)rec=l,f[i][i][0]=f[i][i][1]=0;
            else f[i][i][0]=f[i][i][1]=0x3fffffff;
        for(int i=rec;i;i--)
            for(int j=i+1;j<=n;j++){
                f[i][j][0]=min(f[i+1][j][0]+(s[i+1]-s[i])*(n-j+i),f[i+1][j][1]+(s[j]-s[i])*(n-j+i));
                f[i][j][1]=min(f[i][j-1][1]+(s[j]-s[j-1])*(n-j+i),f[i][j-1][0]+(s[j]-s[i])*(n-j+i));
            }
        printf("%d
    ",min(f[1][n][0],f[1][n][1]));
    }
  • 相关阅读:
    发呆发呆发呆发呆发呆发呆发
    大众捷达看想吃 v 觉得分开才相聚离开都出现
    yjggj
    test4
    test3
    test2
    test1
    Java并发之线程池ThreadPoolExecutor源码分析学习
    Java并发之AQS同步器学习
    ThreadLocal和ThreadLocalMap源码分析
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532217.html
Copyright © 2011-2022 走看看