码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 659 G. Fence Divercity 组合数学 dp

时间:2016-07-12 13:58:32      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

http://codeforces.com/problemset/problem/659/G

 

思路:

f(i,0/1,0/1) 表示到了第i个,要被切的块开始了没有,结束了没有的状态的方案数

 

递推看代码:

 

                                            
  //File Name: cf659G.cpp
  //Author: long
  //Mail: 736726758@qq.com
  //Created Time: 2016年07月12日 星期二 12时40分28秒
                                   

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>

#define LL long long

using namespace std;

const int MAXN = 1000000 + 3;
const int MOD = (int)1e9 + 7;

LL h[MAXN];
LL f[MAXN][2][2];

LL solve(int n){
    h[n+1] = 1;
    memset(f,0,sizeof f);
    f[0][0][0] = 1;
    for(int i=1;i<=n;i++){
        f[i][0][0] = 1;
        (f[i][1][1] = f[i-1][1][1] + h[i] - 1 + f[i-1][1][0] * min(h[i]-1,h[i-1]-1) % MOD) %= MOD;
        (f[i][1][0] = min(h[i],h[i+1]) - 1 + f[i-1][1][0] * min(min(h[i-1]-1,h[i]-1),h[i+1]-1)) %= MOD;
        //printf("i = %d %lld %lld\n",i,f[i][1][0],f[i][1][1]);
    }
    return f[n][1][1];
}

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

 

codeforces 659 G. Fence Divercity 组合数学 dp

标签:

原文地址:http://www.cnblogs.com/-maybe/p/5663199.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!