Kevin and Puzzle
动态规划,dp[i][j],j=0/1表示此人说真话还是假话,因为说谎者的数据不可信,所以转移时没有任何条件dp[i][1]=dp[i-1][0];而说真话的人有两种情况,前一个人说真话或者说假话,分开讨论,最后结果就是dp[n][0]+dp[n][1];
`#include<bits/stdc++.h>
using namespace std;
define int long long
const int MOD=998244353;
void solve(){
int n;
cin>>n;
vector
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
}
vector<array<int,2>>dp(n+1);
dp[0][0]=1;
for(int i=1;i<=n;i++){
dp[i][1]=dp[i-1][0];
if(arr[i]arr[i-1]){
dp[i][0]=dp[i-1][0]%MOD;
}
if(i>=2&&arr[i]arr[i-2]+1){
dp[i][0]=(dp[i][0]+dp[i-1][1])%MOD;
}
}
printf("%d\n",(dp[n][0]+dp[n][1])%MOD);
return;
}
signed main(){
int t;
scanf("%lld",&t);
for(int i=0;i<t;i++){
solve();
}
return 0;
}`