Reversi

typeryougishiki

2019-07-15 20:34:38

Personal

### 思路: 大概算DP,从第N个往前遍历,统计i..n区间内的可能性数量f[i] 如果i和i+1的颜色相同,则f[i] = f[i+1] 否则f[i] = f[i+1]+{f[j+1]|color[i]==color[j]&&color[j]!=color[j+1]} 需要在向前遍历的时候记录每个颜色的石头下一个石头(颜色不一样的情况下)开头的区间情况数sit[c],就有f[i] = f[i+1] + sit[color[i]],复杂度降到O(n) ### 代码: ```cpp #include<iostream> #include<cstdio> #include<algorithm> #include<vector> #include<queue> #include<functional> #include<map> #include<cstring> #include<string> #include<array> #include<set> #include<map> #pragma warning(disable:4996) using namespace std; typedef long long ll; int ss[200001] = {}; int rec1[200010] = {}; vector<int> rec2[200010]; ll rec3[200010] = {}; ll rec4[200010] = {}; int main() { //freopen("test.txt","r",stdin); int n; cin >> n; for (size_t i = 1; i <= n; i++) { scanf("%d", &ss[i]); rec1[i] = rec2[ss[i]].size(); rec2[ss[i]].push_back(i); } rec4[ss[n]] = 1; rec3[n] = 1; for (int i = n - 1; i >= 1; i--) { rec3[i] += rec3[i + 1]; if (ss[i] == ss[i+1]) { continue; } int j = rec1[i]+1; rec3[i] += rec4[ss[i]]; rec3[i] %= 1000000007; if (ss[i] != ss[i + 1]) { rec4[ss[i]] += rec3[i + 1]; rec4[ss[i]] %= 1000000007; } } cout << rec3[1] << endl; return 0; } ```