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; }
出处:http://www.cnblogs.com/lightsong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。