1. 程式人生 > 其它 >Atcoder ABC220 D(記憶化搜尋||DP)

Atcoder ABC220 D(記憶化搜尋||DP)

https://atcoder.jp/contests/abc220/tasks/abc220_d

設f[i][j]表示拿出要操作的數之後剩餘長度為i,在序列外的數為j的方案數,進行記憶化搜尋。

注意因為f[i][j]中可能存0,所以f[][]之前沒有搜尋過的標誌不能為f[i][j]=0,應該將f[i][j]初始化為-1,否則相當於對f[i][j]=0的情況並沒有記憶化,會TLE。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=998244353;
int n;
int j;
int a[100005];
int f[100005][10];
int dfs(int len,int x){
	if(f[len][x]!=-1) return f[len][x];
	if(len==0) return f[len][x]=(x==j);
	int tmp=a[n-len+1];
	return f[len][x]=(dfs(len-1,(x+tmp)%10)+dfs(len-1,(x*tmp)%10))%mod;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=0;i<=9;i++){
		j=i;
		memset(f,-1,sizeof(f));
		printf("%d\n",(dfs(n-2,(a[1]+a[2])%10)+dfs(n-2,(a[1]*a[2])%10))%mod);
	}
	return 0;
}