您的位置:首页 > 其它

hdu 5185(动态规划)

2016-07-21 11:38 211 查看

Equation

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 500 Accepted Submission(s): 168


[align=left]Problem Description[/align]
Gorwin is very interested in equations. Nowadays she gets an equation like this
x1+x2+x3+⋯+xn=n, and here
0≤xi≤nfor1≤i≤nxi≤xi+1≤xi+1for1≤i≤n−1

For a certain n, Gorwin wants to know how many combinations of xi satisfies above condition.
For the answer may be very large, you are expected output the result after it modular m.

[align=left]Input[/align]
Multi test cases. The first line of the file is an integer T indicates the number of test cases.
In the next T lines, every line contain two integer n,m.

[Technical Specification]
1≤T<20
1≤n≤50000
1≤m≤1000000000

[align=left]Output[/align]
For
each case output should occupies one line, the output format is Case
#id: ans, here id is the data number starting from 1, ans is the result
you are expected to output.
See the samples for more details.

[align=left]Sample Input[/align]

2
3 100
5 100

[align=left]Sample Output[/align]

Case #1: 2
Case #2: 3

[align=left]Source[/align]
BestCoder Round #32

题意:求解满足条件的 x1+x2+ ... +xn = n 的种类数。
题解:设计状态为 dp[i][j] 1- i 种数组成 j 的方案数。首先,我们可以确定 xi 的最大值为 1+2...+k = n 里面这个 k ,这样就可以将 dp[i][j]中的 i 确定成 k 了.然后 dp方程是 dp[i][j] = dp[i][j-i]+dp[i-1][j-i] 代表当选择第 i 种数的时候,前面要么选择 i 要么选择 i-1 。。然后最后再求一次和就可以了。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <algorithm>
#include <math.h>
using namespace std;
int dp[320][50005];
int main()
{
int tcase,t=1;
scanf("%d",&tcase);
while(tcase--){
int n,m;
scanf("%d%d",&n,&m);
int k = 0;
while(k*(k+1)<=2*n) k++;
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i=1;i<=k;i++){
for(int j=i;j<=n;j++){
dp[i][j] = (dp[i][j-i]+dp[i-1][j-i])%m;
}
}
int ans = 0;
for(int i=1;i<=k;i++){
ans = (ans+dp[i]
)%m;
}
printf("Case #%d: %d\n",t++,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: