文字が [0 - 9] の範囲の数字に過ぎない文字列があるとします。例: 「2486」。ここで、桁の合計が 6 で割り切れるすべてのサブシーケンスを見つけたいと思います。例: "2486" では、サブシーケンスは - "6"、"246" (2+ 4 + 6 = 12 は 6 で割り切れます)、 "486" (4 + 8 + 6 = 18 は 6 で割り切れる) など。これを実行できるすべての 2^n の組み合わせを生成することがわかっています。しかし、それは非常に費用がかかります。これを行う最も効率的な方法は何ですか?
編集:
Quoraのどこかに次の解決策が見つかりました。
int len,ar[MAXLEN],dp[MAXLEN][MAXN];
int fun(int idx,int m)
{
if(idx==len)
return (m==0);
if(dp[idx][m]!=-1)
return dp[idx][m];
int ans=fun(idx+1,m);
ans+=fun(idx+1,(m*10+ar[idx])%n);
return dp[idx][m]=ans;
}
int main()
{
// input len , n , array
memset(dp,-1,sizeof(dp));
printf("%d\n",fun(0,0));
return 0;
}
誰かがコードの背後にあるロジックを説明できますか - 'm*10+ar[idx])%n' ? ここで m に 10 を掛けるのはなぜですか?