| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
776K 0ms 水过我的递推公式:
P(n,m)=1(当n=m或n=2m时),
=0(当n/2<m<n时),
=\sigma_{l\geq m}P(n-2m, l)(其他情况)
其中,P(n,m)为和为n两端的数为m的序列个数
然后记忆化搜索就可以了
#include <stdio.h>
bool jsed[300][300] = {false};
long long int jg[300][300];
long long int getAns(int n, int m){
if(m==n || n==2*m) return 1;
if(m > n/2) return 0;
if(jsed[n][m]) return jg[n][m];
long long int res = 0;
if(n >= 3*m) res += 1;
for(int l = m; n >= 2 * (l+m); l++) res += getAns(n-2*m, l);
jsed[n][m] = true;
jg[n][m] = res;
return res;
}
int main() {
while(1){
int n;
scanf("%d", &n);
if(n == 0) return n;
long long int res = 0;
for(int i = 1; i <= n/2; i++) res += getAns(n, i);
res += 1;
printf("%d %I64d\n", n, res);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator