CodeForces 659G Fence Divercity (DP)

原创 2016年05月31日 10:40:50

解析:设dp[i][j]为考虑前i个Fence,cut的部分包含第i个Fence,第i个Fence处理后的高度为j的方案数。

则首先 1<=j<h[i]

如果j<h[i-1],dp[i][j] = 1+sigma(dp[i-1][k]),  1<=k<=min(h[i-1]-1,h[i]-1);

反之,dp[i][j] = 1;

得到转移方程后显然不能直接用,因为空间和时间都特别大,但是我们注意到,对于每一个i,我们只需要维护3个前缀和就可以完成方程的转移。

设s[i][j] = dp[i][1]+dp[i][2]+...+dp[i][j],

这样一来,需要维护的j 的值有三个,min(h[i-1]-1,h[i]-1),h[i],min(h[i]-1,h[i+1]-1);

[code]:

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
typedef long long LL;
const LL MOD = 1e9+7;
const int maxn = 1e6+6;

int n,h[maxn];
LL dp[maxn][3];

int main(){
    int i,j;
    scanf("%d",&n);
    for(i = 1;i <= n;i++) scanf("%d",&h[i]);
    int a,b,c;
    h[0] = 1;h[n+1] = 1;
    for(i = 1;i <= n;i++){
        a = min(h[i-1]-1,h[i]-1);
        b = h[i];
        c = min(h[i]-1,h[i+1]-1);
//printf("%d %d %d %d\n",i,a,b,c);
        dp[i][0] = (a*dp[i-1][2]+a)%MOD;
        dp[i][1] = (dp[i][0]+b-a)%MOD;
        if(c <= a) dp[i][2] = (c*dp[i-1][2]+c)%MOD;
        else dp[i][2] = (dp[i][0]+c-a)%MOD;
//printf("--> 0 : %I64d | 1 : %I64d | 2 : %I64d\n",dp[i][0],dp[i][1],dp[i][2]);
    }
    LL res = 0;
    for(i = 1;i <= n;i++){
        res = (res+dp[i][1]-1)%MOD;
    }
    res = (res + MOD)%MOD;
    printf("%I64d\n",res);
    return 0;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces 659G Fence Divercity

题意:有n个墙连续在一起 每个高度为ai个砖块 现在要拆砖块,拆的砖块要连着,而且不能拆最下面能一个和要从最上面那个砖块开始拆,问有几种方案。 思路:只要每次记录一个前面传导到当前墙壁高度可...
  • u011528035
  • u011528035
  • 2016年07月17日 08:14
  • 131

CodeForces - 659G Fence Divercity (DP)好题

CodeForces - 659G Fence Divercity Time Limit: 2000MS   Memory Limit: 262144KB   64bi...
  • yanghui07216
  • yanghui07216
  • 2016年04月05日 18:08
  • 678

Codeforces 659G Fence Divercity (组合计数)

#include #include #include #include #include #include #include #include #inc...
  • u013654696
  • u013654696
  • 2016年03月31日 15:43
  • 369

codeforces 448CPainting Fence

题目:codeforces 448CPainting Fence 题意:n个1* a [ i ] 的木板,把他们立起来,变成每个木板宽为1长为 a [ i ] 的栅栏,现在要给栅栏刷漆,刷子...
  • y990041769
  • y990041769
  • 2014年07月18日 18:23
  • 1520

codeforces 448C C. Painting Fence(分治+dp)

题目链接:codeforces 448C题目大意:给出n个杆子,每个杆子有一个长度,每次可以刷一行或一列,问最少刷多少次可以将整个墙刷成黄色。题目分析: 首先我们能够想到,如果横着刷,为了得到最优解,...
  • qq_24451605
  • qq_24451605
  • 2015年09月16日 13:19
  • 1170

CodeForces-448C Painting Fence

#include #include #include #include #include using namespace std; vector fence; int n; int d...
  • somniloquy_
  • somniloquy_
  • 2015年08月16日 20:39
  • 287

Painting Fence - #256 (Div. 2) C (448C) dp

Painting Fence time limit per test 1 second memory limit per test 512 megabytes inp...
  • u014733623
  • u014733623
  • 2014年07月18日 13:16
  • 1202

codeforces div2 346 G Fence Divercity Dp + 计数

/* 题目描述:在一个类似俄罗斯方块的图中,从最顶部(一定是顶部)拿走连通的一些正方形块,(题目及图片见底部),问一共有多少种拿法。 思路:首先把所有h[k]减1,保证不会掏...
  • jijijix
  • jijijix
  • 2016年12月16日 21:29
  • 115

【Codeforces659G】Fence Divercity【数学】【计数DP?】

【题目链接】 题意:给出一些积木,现在可以拿走一些积木,但是拿走一个积木的要求是该积木上面的积木都被拿走,并且要求拿走的积木构成的阴影图是连通的。最底下一层不能拿走。求方案数。 其实是个数学计...
  • BraketBN
  • BraketBN
  • 2016年03月31日 22:48
  • 517

Fire - POJ 2152 树形dp

Fire Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1098   Accepted:...
  • u014733623
  • u014733623
  • 2014年10月04日 14:59
  • 661
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForces 659G Fence Divercity (DP)
举报原因:
原因补充:

(最多只允许输入30个字)