题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1502

思路:dp[3*n][n][n][n],第一维是长度,第2.3.4维是a,b,c的个数,写出的转移方程不是超Int就是超内存,java跑出的结果和别人AC代码跑出的结果相同,思路是对的

后来参考别人的思路又想了一个省空间的状态转移方程dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1],java的捕异常让人很烦啊

AC代码:

import java.io.*;
import java.util.*;
import java.math.BigInteger;

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
int n;
while (cin.hasNextInt()) {
n = cin.nextInt();
BigInteger[][][] dp = new BigInteger[61][61][61];
for(int i=0; i<=60; i++)
{
for(int j=0; j<=60; j++)
{
for(int k=0; k<=60; k++)
{
dp[i][j][k] = BigInteger.ZERO;
}
}
}
dp[1][0][0] = BigInteger.ONE;
dp[1][1][0] = BigInteger.ONE;
dp[1][1][1] = BigInteger.ONE;
for(int i=2; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
if(j > i)
continue;
for(int k=0; k<=n; k++)
{
if(k > j)
continue;
dp[i][j][k] = dp[i][j][k].add(dp[i-1][j][k]);
if(j - 1 < i && j - 1 >= 0)
dp[i][j][k] = dp[i][j][k].add(dp[i][j-1][k]);
if(k - 1 < j && k - 1 >= 0)
dp[i][j][k] = dp[i][j][k].add(dp[i][j][k-1]);
}
}
}
System.out.println(dp[n][n][n]+"");
System.out.println("");
}
}

}


错误代码1:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int dp[200][60][60][60];
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
memset(dp,0,sizeof(dp));
dp[1][1][0][0] = 1;
for(int i=2; i<=3*n; i++)
{
for(int j=1; j<=n; j++)
{
for(int k=0; k<=n; k++)
{
if(k > j)
continue;
for(int l=0; l<=n; l++)
{
if(l > k)
continue;
if(j + k + l != i-1)
continue;
if(j + 1 <= n)
dp[i][j+1][k][l] += dp[i-1][j][k][l];
if(k < j && k + 1 <= n)
dp[i][j][k+1][l] += dp[i-1][j][k][l];
if(l < k && l + 1 <= n)
dp[i][j][k][l+1] += dp[i-1][j][k][l];
}
}
}
}
printf("%d\n\n",dp[3*n][n][n][n]);
}
return 0;
}

直接超了int,改用Java写

错误代码2:

import java.io.*;
import java.util.*;
import java.math.BigInteger;
public class Test4 {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
int n;
while(cin.hasNextInt())
{
n = cin.nextInt();
BigInteger[][][][] dp = new BigInteger[181][61][61][61];
for(int i=1; i<=180; i++)
{
for(int j=0; j<=60; j++)
{
for(int k=0; k<=60; k++)
{
if(k > j)
continue;
for(int l=0; l<=60; l++)
{
if(l > k)
continue;
dp[i][j][k][l] = BigInteger.ZERO;
}
}
}
}
dp[1][1][0][0] = BigInteger.ONE;
for(int i=2; i<=3*n; i++)
{
for(int j=1; j<=n; j++)
{
for(int k=0; k<=n; k++)
{
if(k > j)
continue;
for(int l=0; l<=n; l++)
{
if(l > k)
continue;
if(j + k + l != i-1)
continue;
if(j+1 <=n)
dp[i][j+1][k][l] = dp[i][j+1][k][l].add(dp[i-1][j][k][l]);
if(k < j && k+1 <= n)
dp[i][j][k+1][l] = dp[i][j][k+1][l].add(dp[i-1][j][k][l]);
if(l < k && l+1 <= n)
dp[i][j][k][l+1] = dp[i][j][k][l+1].add(dp[i-1][j][k][l]);
}
}
}
}
System.out.println(dp[3*n][n][n][n]+"");
System.out.print("");
}
}

}


超内存了