首页 > 其他分享 >P1220 关路灯 (有点不同的区间dp)

P1220 关路灯 (有点不同的区间dp)

时间:2023-03-05 20:46:38浏览次数:67  
标签:路灯 ch int sum pos P1220 dp define

P1220 关路灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

本题有个很重要的信息:大爷是可以随手关灯,所以对于区间[i~j],出于贪心,大爷最后要么在 i 位置,要么在 j 位置。

令DP[i][j][0/1],为0时在 i 位置,为1时在 j 位置 关掉区间[ i , j ]所需的最少时间(这跟P3205 [HNOI2010]合唱队的dp状态很像) 

考虑区间dp[i][j][0/1]的转移:

先考虑dp[i][j][0]。;

如果我们考虑 k 便是考虑 dp[i][k][0/1]与dp[k+1][j][0/1],但这也™的难写,而且在走的过程中,dp[i][k][0/1]与dp[k+1][j][0/1]直接好像没法联系一起,因为走的时候还要考虑其他亮着的灯消耗的功率。

但实际上dp[i][j][0]只会从dp[i+1][j][0/1]转移过来

对于dp[i+1][j][0]:dp[i][j][0]=dp[i+1][j][0]+(pos[i+1]-pos[i])*(sum[n]-(sum[j]-sum[i])).(从pos[i+1]走到pos[i],其他的灯还是亮着会消耗,这一段很容易忘写)

对于dp[i+1][j][1]:dp[i][j][0]=dp[i+1][j][1]+(pos[j]-pos[i])*(sum[n]-(sum[j]-sum[i])).

所以:dp[i][j][0]=min(dp[i+1][j][0]+(pos[i+1]-pos[i])*(sum[n]-(sum[j]-sum[i])),

          dp[i+1][j][1]+(pos[j]-pos[i])*(sum[n]-(sum[j]-sum[i])));

对于dp[i][j][1]同理。

dp[i][j][1]也只会从dp[i][j-1][0/1]转移过来

与dp[i][j][0]转移同理

 

初始化:dp[i][i][0/1]=INF,dp[c][c][0/1]=0;这道题不用dp[i][j][0/1]=INF,因为dp[i][j][0/1]不需要min(dp[i][j][0/1]);

 

Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   
#define popb pop_back  
#define fi first
#define se second
const int N=110;
//const int M=;
//const int inf=0x3f3f3f3f;     
const ll INF=0x3ffffffffffff;
int T,n,c,pos[N],w[N];
ll dp[N][N][3],sum[N];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);
    n=read(),c=read();
    for(int i=1;i<=n;i++)
    {
        pos[i]=read();w[i]=read();
        sum[i]=sum[i-1]+w[i];
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) dp[i][i][0]=dp[i][i][1]=INF;
    dp[c][c][0]=dp[c][c][1]=0;
    for(int len=2;len<=n;len++)
        for(int i=1;i+len-1<=n;i++)
        {
            int j=i+len-1;
            dp[i][j][0]=min(dp[i+1][j][0]+(pos[i+1]-pos[i])*(sum[n]-(sum[j]-sum[i])),
                            dp[i+1][j][1]+(pos[j]-pos[i])*(sum[n]-(sum[j]-sum[i])));
            dp[i][j][1]=min(dp[i][j-1][0]+(pos[j]-pos[i])*(sum[n]-(sum[j-1]-sum[i-1])),
                            dp[i][j-1][1]+(pos[j]-pos[j-1])*(sum[n]-(sum[j-1]-sum[i-1])));
        }
    printf("%lld",min(dp[1][n][0],dp[1][n][1]));
    return 0;
}

标签:路灯,ch,int,sum,pos,P1220,dp,define
From: https://www.cnblogs.com/Willette/p/17181515.html

相关文章

  • 【AT_dp_r】Walk
    又是简单题。我们知道弗洛伊德可以求解传递闭包。我们有矩阵\(M\),我们给\(M_{k,i,j}\)定义为\(i\toj\)长度为\(k\)的路径数,细想不难发现有转移:\(M_{k,i,j}=\su......
  • CF1778F Maximizing Root - 树形 dp -
    题目链接:https://codeforces.com/problemset/problem/1778/F题解:设\(dp_{i,j}\)表示考虑到\(i\)结点,要让子树内的点都变成\(a_i\)第\(j\)小约数的倍数的话,至少要......
  • linux安装提示:Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource
    这个错误可能是因为你的系统中有其他进程正在使用apt或dpkg,导致锁定文件被占用。你可以尝试以下方法来解决:等待其他进程完成,或者关闭软件更新器或Synaptic包管理器等程序......
  • 微服务 - 搭建k8s(minikube)与简单wordPress实战
    Kubernetes的基本架构Kubernetes的基本架构,由Matser和Node子节点组成,使用kubectl进行通信,Master里的组件有哪些:Master里有4个组件,分别是apiserver、etcd、schedu......
  • dpulicate attribute报错问题
    在我们进行前端绘制时,有时会出现以下报错  该错误的意思一般为前端语句重复或layout下多出了width和height语句或者其他语句重复,导致报错......
  • android studio 打包发布 Cause: failed to decrypt safe contents entry: javax.cryp
    androidstudio打包发布错误:Cause:failedtodecryptsafecontentsentry:javax.crypto.BadPaddingException:Givenfinalblocknotproperlypadded.Suchissues......
  • 【android】Android SharedPreferences使用详解
    【参考连接】AndroidSharedPreferences使用详解androidSharedPreferences实现用户的注册和保存账号密码......
  • 区间dp
    [acwing]1222.密码脱落/*有多少个前后不配对的字符,就说明脱落了多少个,即总长度减去回文子序列的长度dp[i][j]表示str[i,j]的最长回文子序列的长度......
  • LT8911EXB-MIPI转EDP视频转换芯片功能特性及概述
    LT8911EXB:MIPI®DSI/CSIBridgetoeDP 1.特性●单端口MIPI®DSI接收器◆符合D-PHY1.2、DSI1.3、CSI1.3标准◆1个时钟通道和1~4个可配置的数据通道......
  • P3205 [HNOI2010]合唱队(区间dp+方案数)
    P3205[HNOI2010]合唱队-洛谷|计算机科学教育新生态(luogu.com.cn)这道题大区间包括小区间,每加一个人都会让区间更大;考虑区间DP:对于区间[i~j],这段区间最新......