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;
}

 

 

 

posted on 2010-06-12 21:34  ylfdrib  阅读(875)  评论(0编辑  收藏  举报