• 洛谷 1220 关路灯


    一道典型的区间dp题

    我一开始做的时候,忘记了之前是怎么写这道题的了

    于是翻开之前的代码

    回忆起了这题的大致思路

    dp[i][j][0/1]

    表示i~j区间,0表示老张现在正在区间的i端,1表示老张正在区间的j端

    我们想一下怎么转移

    肯定是由i+1,j或者i,j-1转移过来的

    那么我们只要计算一下除了i+1,j区间之外的还亮着的耗能,和i,j-1区间之外的还亮着的耗能

    这个计算很简单,只需要计算一下前缀和就可以算出来了

    我们看看代码

     1 #include <cstdio>//0在i,1在j
     2 #include <cstdlib>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <cstring>
     6 #include <iostream>
     7 using namespace std;
     8 const int N=1000;
     9 int sum[N],p[N],d[N],n,c,dp[N][N][2];
    10 int calc(int a,int b,int i,int j)
    11 {
    12     return (p[b]-p[a])*(sum[i]+sum[n]-sum[j]);
    13 }
    14 int main()
    15 {
    16     scanf("%d %d",&n,&c);
    17     for(int i=1;i<=n;i++)
    18     {
    19         scanf("%d %d",&p[i],&d[i]);
    20         sum[i]=sum[i-1]+d[i];
    21     }
    22     memset(dp,0x3f,sizeof(dp));
    23     dp[c][c][0]=dp[c][c][1]=0;
    24     for(int i=c;i<=n;i++)
    25     {
    26         for(int j=i-1;j>=1;j--)
    27         {
    28             dp[j][i][0]=min(dp[j+1][i][1]+calc(j,i,j,i),dp[j+1][i][0]+calc(j,j+1,j,i));
    29             dp[j][i][1]=min(dp[j][i-1][0]+calc(j,i,j-1,i-1),dp[j][i-1][1]+calc(i-1,i,j-1,i-1));
    30         }
    31     }
    32     printf("%d
    ",min(dp[1][n][0],dp[1][n][1]));
    33     return 0;
    34 }

    一开始不要忘记赋初始值0

  • 相关阅读:
    Redis 主从复制
    LESSON THREE
    SSIS OLEDB COMMAND RULES
    Hadoop step by step _ install and configuration environment
    repcached的安装练习
    Check list
    简单对象定位——xpath定位
    简单对象定位
    Python webdriver API- 浏览器的操作
    第一个自动化脚本示例
  • 原文地址:https://www.cnblogs.com/wzrdl/p/9789132.html
Copyright © 2020-2023  润新知