搞了快一个月的高效和动归了, 太费脑子,水一道数学~
该题是递推题,动归没白搞,很快就写出来了 。 现在有点明白为什么比赛要测试栈深了,递归的应用实在是太多了 。
一般对某数取模是因为答案太大会爆long long , 至于为什么要对这么奇怪的一个数取模,好像是因为这样答案离散的比较好?有清楚的朋友希望不吝赐教 !
代码如下:
#include<bits/stdc++.h> using namespace std; typedef long long ll; int T,n,maxn; ll d[1005],c[1005][1005],kase=0; ll dp(int m) { if(m == 0) return 1; ll& ans = d[m]; if(d[m] != -1) return ans; ans = 0; for(int i=1;i<=m;i++) { ans += (c[m][i] * dp(m-i)); } return ans %= 10056; } int main() { scanf("%d",&T); memset(d,-1,sizeof(d)); for(int i=0;i<=1002;i++) { c[i][0] = 1; for(int j=1;j<=i;j++) c[i][j] = (c[i-1][j-1] + c[i-1][j])%10056; } while(T--) { scanf("%d",&n); printf("Case %d: %lld\n",++maxn,dp(n)); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/47109637