解法
書いていて気持ちが良くなるメモ化再帰。
書いていて気持ちが良い(再掲)
ソース
#include<iostream> #include<algorithm> using namespace std; int dp[10][1<<10][331], n; //nの制約は自明だけど sはどれくら(ry ← 331か int rec( int now, int used,int sum){ if( sum < 0 ) return 0; if( now == n ) return sum == 0; if(~dp[now][used][sum]) return dp[now][used][sum]; int ret = 0; for(int i = 0 ; i < 10 ; i++ ){ if((used >> i) & 1) ret += rec( now + 1, used&~(1 << i), sum - i * (now + 1)); } return dp[now][used][sum] = ret; } int main(){ int s; while(cin >> n >> s){ fill_n( **dp, 10 * (1 << 10) * 331, -1); cout << rec( 0, (1 << 10) - 1, s) << endl; } }
0 件のコメント:
コメントを投稿