AT_agc031_b 题解
AT_agc031_b [AGC031B] Reversi 题解
算法:DP
很棒的 dp 题。
证明:
-
显然,无论过去状态与决策如何,对前面的决策所形成的状态而言,余下的诸决策构成的必定是最优策略。即符合最优化原理。
-
一旦当前状态确定,则此后过程的演变不再受该状态影响。即符合无后效性原则。
可以用 DP。
证毕。
实现方案
设前 \(i\) 块石头所有可能的石头排列方案数为 \(dp_i\)。
设 \(fa_a\) 为 \(a\) 上一次出现的位置。
由于每个状态仅有两种转移方式:实施操作或不实施操作。
那么转移方程为:
\[dp_i \gets \begin{cases} dp_{i-1}&i = 1 \\ dp_{i-1}+ dp_{fa_{a_i}}&i > 1 \end{cases}
\]
当然,必须保证 \(fa_{a_i}=i-1\) 不成立。
复杂度
显然,为 \(O(n)\)。
CODE
#include<iostream>
#define int long long
const int N=2e5+5;
const int mod=1e9+7;
int dp[N];
int fa[N];
int n;
signed main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0),std::cout.tie(0);
std::cin>>n;
for(int i=1;i<=n;i++){
int a;
std::cin>>a;
dp[i]=i==1?1:dp[i-1];
dp[i]+=fa[a]==i-1?0:dp[fa[a]];
dp[i]%=mod;
fa[a]=i;
}
std::cout<<dp[n];
return 0;
}

浙公网安备 33010602011771号