Atcoder ABC220 D(記憶化搜尋||DP)
阿新 • • 發佈:2021-09-29
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; }