首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

hdu 4248 A Famous Stone Collector(结合数学&DP)

2013-10-27 
hdu 4248A Famous Stone Collector(组合数学&DP)A Famous Stone CollectorTime Limit: 30000/15000 MS (Ja

hdu 4248 A Famous Stone Collector(组合数学&DP)

A Famous Stone CollectorTime Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 765    Accepted Submission(s): 286


Problem DescriptionInputOutputSample InputSample OutputSourceRecommend#include<algorithm>#include<iostream>#include<string.h>#include<sstream>#include<stdio.h>#include<math.h>#include<vector>#include<string>#include<queue>#include<set>#include<map>using namespace std;const int INF=0x3f3f3f3f;const int maxn=100010;const int mod=1000000007;int C[15000][150],num[150];__int64 dp[150][15000];//注意数组大小int main(){ int i,j,k,n,cas=1,sum,ans; for(i=0;i<=10010;i++)//注意组合数的范围 { C[i][0]=1; for(j=1;j<=i&&j<=105;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod; } while(~scanf("%d",&n)) { for(i=1;i<=n;i++) scanf("%d",num+i); sum=0; memset(dp,0,sizeof dp); dp[0][0]=1; for(i=1;i<=n;i++) { sum+=num[i]; for(k=0;k<=num[i];k++)//由于利用上层结果。j,k嵌套顺序无关。 for(j=k;j<=sum;j++) dp[i][j]=(dp[i][j]+dp[i-1][j-k]*C[j][k])%mod; } ans=0; for(i=1;i<=sum;i++) ans=(ans+dp[n][i])%mod; printf("Case %d: %d\n",cas++,ans); } return 0;}


热点排行