CodeForces 659G Fence Divercity (DP)

6人阅读 评论(0) 收藏 举报
分类:

解析:设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);

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

long long mod=1e9+7;
long long dp[1000005][3];

int h[1000005];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&h[i]);
        }

        h[0]=1;
        h[n+1]=1;
        for(int i=1;i<=n;i++)
        {
            int a=min(h[i]-1,h[i-1]-1);
            int b=h[i];
            int c=min(h[i]-1,h[i+1]-1);

            dp[i][0] = (dp[i-1][2]+1)*a%mod;
            dp[i][1] = (dp[i][0]+b-a-1)%mod;

            if(c>=a)
                dp[i][2] = (dp[i][0]+c-a)%mod;
            else
                dp[i][2] = (dp[i-1][2]+1)*c%mod;

        }

        long long ans=0;
        for(int i=1;i<=n;i++)
        {
            ans=(ans+dp[i][1])%mod;
        }

        ans=(ans+mod)%mod;
        printf("%lld\n",ans);

    }
}


查看评论

CodeForces - 659G Fence Divercity (DP)好题

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

Codeforces 659G Fence Divercity (组合计数)

#include #include #include #include #include #include #include #include #inc...
  • u013654696
  • u013654696
  • 2016-03-31 15:43:16
  • 382

Codeforces 659G Fence Divercity

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

codeforces 448CPainting Fence

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

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

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

Codeforces Round #117 (Div. 2)E---Wooden Fence(dp)

Vasya has recently bought some land and decided to surround it with a wooden fence.He went to a comp...
  • Guard_Mine
  • Guard_Mine
  • 2015-03-21 12:57:02
  • 815

[Codeforces232D]Fence

题目大意给你一个长度为n的序列h和q个询问,每次询问一个区间[l,r],求有多少个区间[x,y]满足以下条件: 1. [l,r]与[x,y]交集为空 2. r-l+1等于y-x+1 3. 对于任...
  • WorldWide_D
  • WorldWide_D
  • 2016-07-08 08:02:00
  • 252

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:09
  • 1228

Codeforces #211 (Div. 2) B. Fence

B. Fence time limit per test 1 second memory limit per test 256 megabytes input st...
  • u011639256
  • u011639256
  • 2013-11-11 20:47:11
  • 949

Codeforces 484E. Sign on Fence 可持久化线段树

大概题意: 给一数组a,问在某一区间L~R中,问对于连续的长为W的一段中最小的数字的最大值是多少. 显然可以转化成二分高度然后判断可行性的问题. 考虑到高度肯定为数组中的...
  • u012797220
  • u012797220
  • 2015-03-11 23:11:10
  • 939
    个人资料
    等级:
    访问量: 1万+
    积分: 585
    排名: 8万+
    文章存档
    最新评论