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 Round #256 (Div. 2) C. Painting Fence (搜索 or DP)

【题目链接】:click here~~ 【题目大意】:题意:你面前有宽度为1,高度给定的连续木板,每次可以刷一横排或一竖列,问你至少需要刷几次。 Sample Input Input 5 2...

Codeforces 659E 找环+(并查集/dfs)

题目: http://codeforces.com/problemset/problem/659/E 题意: 给你一个图,现在要你给这个图里面的边定方向,使得入度为0的点最少。 分析: 对于...

CodeForces 659 C. Tanya and Toys

传送门 C. Tanya and Toys time limit per test1 second memory limit per test256 megabytes inputstanda...

Codeforces 659C Tanya and Toys【贪心】

C. Tanya and Toys time limit per test 1 second memory limit per test 256 megabytes input ...

CodeForces 659 D. Bicycle Race(计算几何 + 数学公式)

传送门 D. Bicycle Race time limit per test1 second memory limit per test256 megabytes inputstandard...

CodeForces 659E New Reform

Description Berland has n cities connected by m bidirectional roads. No road connects a city to...

codeforces 659 D. Bicycle Race

水水的想了半天,没想出方法。。 难道只有无脑码代码了吗。。 最后也只有无脑的码起来了。。 我的方法好笨的。。。然后和同志一起发现,数据只有顺时针跑ORZ。。#include #include #...

【CodeForces】[659C]Tanya and Toys

本来是用数组的下标来存储数字 结果意识到大数存不了 所以换用数组直接存储 然后排序后通过二分查找来判断数字是否在数组里具体的过程则是考虑 剩余的钱数与数字的关系 如果钱足以买这个数字的玩具 ...

简单数学题或者计算几何:Codeforces 659D-Bicycle Race

Codeforces 659D题目大意如下: 自行车环湖赛,车手围绕湖骑行一周,给出车手骑行的路线的每个转弯处的坐标,同时需要注意的是车手在转弯方向朝向湖的时候有骑进湖里的危险。现在要你根据给出的这些...

【Codeforces659E】New Reform【BFS】

【题目链接】 题意:给出一个n个点,m条边的无向图,现在你可以任意规定每个边的方向,使得这个图变为有向图,要求入度为0的点尽量少。 仔细分析一下就看出来了。 如果一个连通块里有n - 1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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