[Cometoj#3 B] _市松模様状圧力DP

チェス盤

トピックへのリンクhttps://cometoj.com/contest/38/problem/B?problem_id=1535

データ範囲:わずか。


問題の解決策

ときにすることができ、行の数が非常に小さいので、$ DP $様の圧力上昇ので。

非常に吸盤の後....

コード

#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <cmath> 

の#define N 1000010 

名前空間stdを使用。

するchar * P1、P2 *、BUF [100000]。

#define NC()(P1、P2 == &&(P2 =(P1 = BUF)+関数fread(BUF、1、100000、STDIN)、P1 == P2)EOF:* P1 ++)

int型RD(){ 
    int型X = 0、F = 1。
    チャーC = NC()。
    一方、(C <48){ 
        IF(C == ' - ')
            、F = -1。
        C = NC()。
    } 
    一方、(C> 47){ 
        X =(((X << 2)+ X)<< 1)+(C ^ 48)、C = NC()。
    } 
    のx * Fを返します。
} 

[N]、B [N] INT、[N] [2] F。

    INT、N = RD()。
    以下のために(INT i = 1; iが<= N; iは++){ 
        [i]は= RD()。
    } 
    {ため(iは++; iがn = <I = 1 INT)
        [I] = RD()Bと、
    } 

    int型のL = N、R = 1。
    以下のために(INT i = 1; iが<= N; iは++){ 
        IF([I] || B [I]){ 
            L = I。
            ブレーク; 
        } 
    } 
    、{ - (I; I I = N INT)のための
        IF([I] || B [I]){ 
            iはR =。
            ブレーク; 
        } 
    } 

    {(; I <= R iが++ iがLに= INT)のために
        ! - [1 I] [0] + [I] [I] [0] FをF = 
        F [i]が[1]のF = [Iを- 1] [1] + B [i]は!。
        F [i]が[0] =分(F [i]が[0]、F [i]を[1] + [I]!)。
        F [i]を[1] =分(F [i]が[1]、F [i]が[0] + B [i]は!)。
    } 

    COUT <<分(F [R] [0]、F [R] [1])<< ENDL。
    0を返します。
}

 

おすすめ

転載: www.cnblogs.com/ShuraK/p/11726377.html