【51nod1519】拆方块[Codeforces](dp)

  题目传送门:1519 拆方块

  首先,我们可以发现,如果第i堆方块被消除,只有三种情况:

  1、第i-1堆方块全部被消除;

  2、第i+1堆方块全部被消除;(因为两侧的方块能够保护这一堆方块在两侧不暴露)

  3、第i堆方块过了h[i]次操作后,从上到下被消除。

  于是我们设l[i]为第i堆方块从左边开始消除的最小操作次数,设r[i]从右边开始消除的最小操作次数。

  然后从左向右dp出l[i],从右向左dp出r[i],然后就能算答案了。

  代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
ll read()
{
    ll tmp=0; char f=1,c=getchar();
    while(c<‘0‘||‘9‘<c){if(c==‘-‘)f=-1;c=getchar();}
    while(‘0‘<=c&&c<=‘9‘){tmp=tmp*10+c-‘0‘;c=getchar();}
    return tmp*f;
}
using namespace std;
int l[100010],r[100010],h[100010];
int main()
{
    int n=read(),i;
    for(i=1;i<=n;i++)h[i]=read();
    l[1]=1; for(i=2;i<=n;i++)l[i]=min(l[i-1]+1,h[i]);
    r[n]=1; for(i=n-1;i;i--)r[i]=min(r[i+1]+1,h[i]);
    int ans=min(l[1],r[1]);
    for(i=2;i<=n;i++)ans=max(ans,min(l[i],r[i]));
    printf("%d",ans);
}

时间: 2024-10-15 09:42:13

【51nod1519】拆方块[Codeforces](dp)的相关文章

【51Nod】1519 拆方块 贪心+递推

[题目]1519 拆方块 [题意]给定n个正整数,\(A_i\)表示第i堆叠了\(A_i\)个石子.每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除.\(n \leq 10^5\). [算法]贪心+递推 观察每轮操作的变化: \[A_i=min \{ A_i-1,A_{i-1},A_{i+1} \} \] 继续推导,因为每一轮要么-1要么取左右,那么也就是一个数传递到另一个位置要加上它们之间距离的代价(一轮一格,每轮少一个 -1 ),也就是每个数字都可以更新为: \[A_x=\min_

10559 - Blocks(方块消除|DP)

该题乍一看和矩阵链乘很相似,可是有一个不同之处就是该题可以拼接 .   为了达到这个目的,我们不得不拓展维度d[i][j][k],用一个k表示最右边拼接了k个和a[j]相同颜色的方块. 问题的关键在于拼接,当右边存在一个q < p 且 a[q] == q[j] && a[q] != a[q+1] 时,可以拼接,要注意,所有满足这个条件的q都应该递归求解,因为哪一部分拼接起来更好,是不一定的 . 细节见代码: #include<bits/stdc++.h> using na

Educational Codeforces Round 62 (Rated for Div. 2)

layout: post title: Educational Codeforces Round 62 (Rated for Div. 2) author: "luowentaoaa" catalog: true tags: mathjax: true - codeforces - dp --- " target="_blank" style="font-size:24px;">传送门 D - Minimum Triangulat

【BZOJ-1952】Area [坑题] 仙人掌DP + 最大点权独立集(改)

1952: [Sdoi2010]Area Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][Discuss] Description 小猪iPig来到了一个叫做pigsty的城市里,pigsty是一座专门为小猪所准备的城市,城市里面一共有n个小区给小猪们居住,并且存在许多条无向边连接着许多小区.因为这里是一个和谐的城市,所以小猪iPig准备在这个城市里面度过他的余生.若干年之后小猪iPig

poj 1390 Blocks 区间DP

Description: 给你一堆方块,颜色相同可以消去,每次消去的价值为消去方块的个数的平方.单个方块可以消去.问你最后收获的最大价值为多少 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int N = 220; 6 int dp[N][N][N], g[N][N], col[N]; 7 //dp[i][j][k]表示i-j这一段消得

[训练日志] 7月13日

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 12.0px Helve

[UVa1213]Sum of Different Primes(递推,01背包)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3654 题意:把n拆成k个不同素数的和,有多少种拆法. dp(i,j)表示数字为i时,有j个不同素数和的组合数. 先枚举素数的上界k,注意是不同素数,那就再在k个素数中做01背包,dp(i,j)+=dp(i-p,j-1)统计出现次数就行了. 1 #include <bits/

(寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)

layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: "luowentaoaa" catalog: true tags: mathjax: true - codeforces - DP - 状态压缩 - LCA 传送门 付队! C - Greetings! (状态压缩) 题意 给N种信件,你可以任意选择K种信封装信件,问你最少的浪费是多少 不能大的信件装

Codeforces 126D Fibonacci Sums 求n由任意的Sum(fib)的方法数 dp

题目链接:点击打开链接 题意: 给定一个数n 问把这个数拆成多个不相同的fibonacci数 有多少种拆法 #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<set> #include<queue> #include<vector> #include<m