Stay Hungry,Stay Foolish!

D - Flip Cards

D - Flip Cards

https://atcoder.jp/contests/abc291/tasks/abc291_d

 

思路

动态规划思想

初始设置, 表示第一个位置, a 和 b各有一种选择

an[1] = 1

bn[1] = 1

 

后面使用递推式:

an[i] += an[i-1] if a[i] != a[i-1]

an[i] += bn[i-1] if a[i] != b[i-1]

 

bn[i] += an[i-1] if b[i] != a[i-1]

bn[i] += bn[i-1] if b[i] != b[i-1]

 

 

Code

https://atcoder.jp/contests/abc291/submissions/39268903

int n;
const long long modulo = 998244353;
 
int main()
{
    cin >> n;
 
    vector<int> a(n+1, 0);
    vector<int> b(n+1, 0);
 
    for(int i=1; i<=n; i++){
        cin >> a[i] >> b[i];
    }
 
    vector<long long> an(n+1, 0);
    vector<long long> bn(n+1, 0);
 
    an[1] = 1;
    bn[1] = 1;
    
    for(int i=2; i<=n; i++){
        int apre = a[i-1];
        int bpre = b[i-1];
        int anow = a[i];
        int bnow = b[i];
 
        if (anow != apre){
            an[i] += an[i-1];
            an[i] %= modulo;
        }
        
        if (anow != bpre){
            an[i] += bn[i-1];
            an[i] %= modulo;
        }
 
        if (bnow != apre){
            bn[i] += an[i-1];
            bn[i] %= modulo;
        }
 
        if (bnow != bpre){
            bn[i] += bn[i-1];
            bn[i] %= modulo;
        }
        
//        cout << "i=" << i << endl;
//        cout << "an=" << an[i] << endl;
//        cout << "bn=" << bn[i] << endl;
    }
 
 
//    cout << "an[n]=" << an[n] << endl;
//    cout << "bn[n]=" << bn[n] << endl;
 
    long long ans = an[n] + bn[n];
 
//    cout << "ans = " << ans << endl;
 
    ans %= modulo;
    
    cout << ans << endl;
 
    return 0;
}
 

 

posted @ 2023-02-26 22:54  lightsong  阅读(88)  评论(0)    收藏  举报
千山鸟飞绝,万径人踪灭