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
",(dfs(n-2,(a[1]+a[2])%10)+dfs(n-2,(a[1]*a[2])%10))%mod);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/New-ljx/p/15350529.html