(ACM题目)为什么我的程序总是RE,求大神解救!!(POJ 3254 Corn Fields)

haizi8888 2014-04-16 01:09:41
public class Main {

private static final int MODULO = 100000000;

// 第二维表示行数
private int dp[][];
private int isOk[];

// 假设所有的土地都是肥沃的情况下,那么最多有多少种情况(就是只有一个约束条件,那就是格子不相邻)
private int goodForFarm[];
private int goodCount;

private int sumState;

public Main(int M, int N) {
sumState = 1 << N;
dp = new int[sumState][M];
isOk = new int[M];

goodForFarm = new int[sumState];

for (int i = 0; i < M; i++) {
Arrays.fill(dp[i], 0);
}
Arrays.fill(isOk, 0);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int M, N;

M = cin.nextInt();
N = cin.nextInt();
Main ma = new Main(M, N);

int bit;

for (int i = 0; i < M; i++) {
bit = 0;
for (int j = 0; j < N; j++) {
bit = (bit << 1);
if(cin.hasNext()){
bit = bit | cin.nextInt();
}
}
ma.isOk[i] = bit;
}

System.out.println(ma.getAllPossible());
}

// 假设所有的土地都是肥沃的情况下,那么最多有多少种情况
private void prepareIt() {
int count = 0;
// TODO Auto-generated method stub
for (int i = 0; i < sumState; i++) {
if ((i & (i << 1)) == 0) {

goodForFarm[count] = i;
count++;
}
}
goodCount = count;
}

private int getAllPossible() {
prepareIt();
// TODO Auto-generated method stub
// 先求出第0层的每一种可能,因为不需要依赖上一层,因此独立开;
for (int i = 0; i < goodCount; i++) {
// 假如i为7就代表...0000111(总共N位),就是说后三个格子放牛的情况
// 接下来就是判断i这种情况是否满足要求,如果满足,那么将dp[i][0]置之1;
if ((goodForFarm[i] & isOk[0]) == goodForFarm[i]) {
// 该状态满足肥沃条件
dp[goodForFarm[i]][0] = 1;
}
}
// 第一个循环,遍历每一层层开始
for (int i = 1; i < isOk.length; i++) {
// 第二个循环,遍历上一层的每种状态
for (int j = 0; j < sumState; j++) {
if (dp[j][i - 1] == 0) {
// 这种状态根本不存在;
continue;
}

// 遍历所有的可能的情况;
for (int k = 0; k < goodCount; k++) {
if ((goodForFarm[k] & isOk[i]) == goodForFarm[k]) {
// 该状态满足肥沃条件
// 只要错开一位,就能判断是否相邻

// 该状态满足不相邻条件
// 看是否会与上一层相邻,
if ((j & goodForFarm[k]) == 0) {
dp[goodForFarm[k]][i] = (dp[goodForFarm[k]][i] + dp[j][i - 1])
% MODULO;
}

}
}
}
}

int countsum = 0;
for (int i = 0; i < sumState; i++) {
countsum = (countsum + dp[i][isOk.length - 1]) % MODULO;
}
return countsum % MODULO;
}

}
...全文
81 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧