hdu1121 Complete the Sequence

http://acm.hdu.edu.cn/showproblem.php?pid=1121

题目大意:给你一个整数序列包含S个整数,让你找到这个序列满足的多项式 P(n) = aD.n^D+aD-1.n^D-1+...+a1.n+a0,当这个多项式的阶最小时,输出接下来的满足这个多项式C个整数

算法分析:hdu推荐为dp题,没思路,找到解题报告(http://rchardx.is-programmer.com/posts/16142.html),说是差分。我的理解是这样的:对于每一项求其与前一项的差,然后观察找规律,对于任意满足多项式P(n) = aD.n^D+aD-1.n^D-1+...+a1.n+a0的D阶多项式,取一阶差分得:tmp = P(n) - (n - 1)肯定是个D-1阶多项式,以此类推,取n-1阶差分,就只剩下一个数d (程序中为f[n-1][0]), 如果d = 0,如果想使得P(n)的阶最小,第n-1阶差分中接下来的m个数应该都为0,如果d != 0,当接着的m个数都为d时,则第n-2阶为1阶多项式(只有一阶多项式(a1.n + a0, 公差为a1)的差分才为一个常数),第n-1阶为0阶多项式,才能保证阶D最小

 

代码
   
     
#include < stdio.h >
#define NN 102
int main()
{
int T, i, j, S, C;
int f[NN][NN];
scanf(
" %d " , & T);
while (T -- ){
scanf(
" %d%d " , & S, & C);
for (i = 0 ; i < S; i ++ )
scanf(
" %d " , & f[ 0 ][i]);
for (i = 1 ; i < S; i ++ )
for (j = 0 ; i + j < S; j ++ )
f[i][j]
= f[i - 1 ][j + 1 ] - f[i - 1 ][j];
for (i = 1 ; i <= C; i ++ )
f[S
- 1 ][i] = f[S - 1 ][ 0 ];
for (i = S - 2 ; i >= 0 ; i -- )
for (j = S - i; j < C + S; j ++ )
f[i][j]
= f[i][j - 1 ] + f[i + 1 ][j - 1 ];
for (i = S; i < S + C - 1 ; i ++ )
printf(
" %d " , f[ 0 ][i]);
printf(
" %d\n " , f[ 0 ][i]);
}
return 0 ;
}

 

 

 

你可能感兴趣的:(sequence)