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;
}

完结撒花

posted @ 2026-01-29 21:29  concert_b  阅读(0)  评论(0)    收藏  举报