| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
比较易读的滚动数组代码及注意点1. 滚动数组注意清除前一次的数值(dp[PREVIOUS][j] = 0;),否则会导致累加值错误,有这个错误的情况下也能通过样例数据。
#include <iostream>
#define PREVIOUS ((i-1+2)%2)
#define CURRENT (i%2)
using namespace std;
int main()
{
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int m, n;
int row[12] = {0};
int plan[1024] = {0};
int dp[2][1024] = {0};
scanf("%d %d", &m, &n);
for(int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
int bit;
scanf("%d", &bit);
// printf("%d ", bit);
row[i] = (row[i]<<1) | !bit;
}
// printf("\nrow[%d]:%d\n", i, row[i]);
}
int plan_count = 0;
for(int i = 0; i < (1<<12); i++)
{
if (!(i & (i << 1)) && (i < (1<<n)))
{
plan[plan_count++] = i;
// printf("plan[%d]:%d\n", plan_count, i);
}
}
for(int i = 0; i < plan_count; i++)
{
if (!(plan[i] & row[0]))
{
dp[0][i] = 1;
}
}
for (int i = 1; i < m; i++)
{
for (int j = 0; j < plan_count; j++)
{
if (!(plan[j] & row[i-1]))
{
for (int k = 0; k < plan_count; k++)
{
if (!(plan[k] & plan[j]) && !(row[i] & plan[k]))
{
dp[CURRENT][k] = dp[CURRENT][k] + (dp[PREVIOUS][j] % 100000000);
}
}
}
dp[PREVIOUS][j] = 0;
}
}
int sum = 0;
for (int i = 0; i < plan_count; i++)
{
sum = sum + dp[(m-1)%2][i] % 100000000;
}
printf("%d\n", sum % 100000000);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator