- TrinomialBrute.java (组合数学中的三项式系数,暴力递归法)
public class TrinomialBrute {
public static long trinomial(int n, int k)
{
if (n == 0 && k == 0)
{
return 1;
}
if (k < -n || k > n)
{
return 0;
}
return trinomial(n-1, k-1) + trinomial(n-1, k) + trinomial(n-1, k+1);
}
public static void main(String[] args)
{
int n = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
StdOut.println(trinomial(n, k));
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
StdOut.print(trinomial(i, j) + " ");
}
StdOut.println();
}
}
}
- TrinomialDP.java (动态规划求解三项式系数)
public class TrinomialDP {
public static long trinomial(int n, int k)
{
if (n == 0 && k == 0)
{
return 1;
}
if (k < -n || k > n)
{
return 0;
}
long[] arr = new long[2*n + 1];
long[] aux = new long[2*n + 1];
arr[n] = 1;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= 2*n; j++)
{
aux[j] = arr[j];
}
aux[n] = arr[n - 1] + arr[n] + arr[n + 1];
for (int j = 1; j <= i; j++)
{
if (n - j - 1 < 0)
{
aux[n - j] = 0;
}
else
{
aux[n - j] = arr[n - j - 1];
}
aux[n - j] += arr[n - j] + arr[n - j + 1];
}
for (int j = 1; j <= i; j++)
{
if (n - j - 1 < 0)
{
aux[n + j] = 0;
}
else
{
aux[n + j] = arr[n + j + 1];
}
aux[n + j] += arr[n + j - 1] + arr[n + j];
}
for (int j = 0; j <= 2*n; j++)
{
arr[j] = aux[j];
}
}
return arr[n + k];
}
public static void main(String[] args)
{
int n = Integer.parseInt(args[0]);
int k = Integer.parseInt(args[1]);
StdOut.println(trinomial(n, k));
}
}
|