ABC145 F Laminate 艺术是让程序员走向秃头的坑

题目链接

简单DP

  • 更改某一列等价于删除这一列
  • 只有斜率>0的柱形会增加笔画数,可用 ∑ max ⁡ ( 0 , h [ i ] − h [ i − 1 ] ) \sum \max(0,h[i]-h[i-1]) max(0,h[i]h[i1])评价价值(value)

dp[i][j] := 第i列不删、第i列和之前总和j列、第i列之后全删的最小笔画数(value最小)

初始化:
d p [ i ] [ j ] : = ∞ , ∀ i , j dp[i][j] := \infty,\quad \forall i,j dp[i][j]:=,i,j
d p [ 0 ] [ 0 ] : = 0 dp[0][0] := 0 dp[0][0]:=0

状态转移等式:
d p [ i ] [ j ] : = min ⁡ 0 ≤ m ≤ i − 1 ( d p [ m ] [ j − 1 ] + max ⁡ ( 0 , h [ i ] − h [ m ] ) ) dp[i][j] := \min_{0\leq m\leq i-1}(dp[m][j-1]+\max(0,h[i]-h[m])) dp[i][j]:=0mi1min(dp[m][j1]+max(0,h[i]h[m]))

坑点1

特判:N==K

点击这里查看完整源码

#include<bits/stdc++.h>
using namespace std;
//省略一些宏
//---------------------
#define MAXN 305
#define INF (INF_LL >> 10ll)
//---------------------
ll n,k;
ll h[MAXN];
ll dp[MAXN][MAXN];
int main(){
    cin >> n >> k;
    REP1(i,n) cin >> h[i];
    h[0] = 0;
    REP(i,MAXN) REP(j,MAXN) dp[i][j] = INF;
    dp[0][0] = 0;
    
    REP1(i,n) REP1(j,i) REP(m,i){
    DBPRT(m);
    DBPRT((j-1));
        dp[i][j] = min(dp[i][j],dp[m][j-1]+max(0ll,h[i]-h[m]));
    }
    
    DBSTART
    PRTLST2(dp,n+1,n-k+1);
    DBEND
    
    ll res = INF;
    REP(i,n+1) res = min(res,dp[i][n-k]);
    PRT(res);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值