*問96 Sum of 4 Integers II http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0096 a+b+c+d=n nは4000以下の自然数 a,b,c,dは0~1000までの数で数nを作る方法は何通りあるか? 解法 昔の自分のほうがかしこいコードを書いてたのでこちらを掲載。 今書いてみたほうは、計算量800万回。 それに対してこちらの計算量は1万回。 昔のほうが賢いコード書いてるな私。 aで作れる数は0~1000までが一通り。 それにbを足すと1000~2000までの数が作れてその通りをab[n]とする。 a+b+c=n3としてn3はn3-1000~n3までのab[n3-1000~n3]までの和となる。 dを足しても同様。 #include<stdio.h> #include<iostream> #include<string.h> long long int memo[4001]={0}; void calc(int up){ long long int sum=0; long long int next[4001]={0}; for(int i=0;i<=up;i++){ sum+=memo[i]; if(i>1000){ sum-=memo[i-1001]; } next[i]=sum; } memcpy(memo,next,sizeof(next)); } int main(){ for(int i=0;i<=1000;i++)memo[i]=1;//aを決定 calc(2000); calc(3000); calc(4000); int n; while(scanf("%d",&n)!=EOF){ std::cout<<memo[n]<<"\n"; } }