Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这个题有什么很变态的测试数据吗?老是过不了。附代码,希望大牛们帮忙,谢谢1

Posted by 315410110 at 2009-04-18 21:37:01 on Problem 1185
#include <iostream>
#include <cmath>
using namespace std;

int dp[60][60][102];
int len = 0,n,m,st[1024];
char map[110][15];

bool ok(int x)
{
	if (x < 0 || x >= m)
		return false;
	return true;
}

int f(int x, int y, int n) //x为行n的炮状态,y为行n-1的炮状态
{
	if (dp[x][y][n] != -1)
		return dp[x][y][n];
	int max = 0;
	int s = 0;
	for (int i = 0; i < m; ++i)
		if ((st[x]&(1<<i)) != 0)
			++s;
	if (n == 1)
	{
		dp[x][y][n] = s;
		return s;
	}
	int temp = st[x]|st[y];
	for (int i = 0; i < len; ++i)
	{
		bool b = true;
		int sum = 0;
		if ( (temp&st[i]) != 0)
			continue;
		for (int j = 0; j < m; ++j)
		{
			if (map[n-2][j] == 'H' && (st[i]&(1<<j)) != 0)
			{
				b = false;
				break;
			}
		}
		if (b)
		{
			int tt = f(y,i,n-1);
			max = max > tt ? max : tt;
		}
	}
	max += s;
	dp[x][y][n] = max;
	return max;
}
int main()
{

	scanf("%d %d",&n,&m);
	int status = (int)pow(2.0,m); //此处是计算出有最多有多少种炮的放法

	//处理每行的所有情况,用位处理,而后存储到st数组中
	for (int i = 0; i < status; ++i)
	{
		bool b = false;
		for (int j = 0; j < m; ++j)
		{
			if ((i&(1<<j)) != 0)
			{
				if (ok(j-1) && (i&(1<<(j-1))) != 0)
				{
					b = true;
					break;
				}
				if (ok(j-2) && (i&(1<<(j-2))) != 0)
				{
					b = true;
					break;
				}
				if (ok(j+1) && (i&(1<<(j+1))) != 0)
				{
					b = true;
					break;
				}
				if (ok(j+2) && (i&(1<<(j+2))) != 0)
				{
					b = true;
					break;
				}
			}
		}
		if (!b)
			st[len++] = i;
	}

	//先初始化下map的第0行,全是山
	for ( int i = 0; i < m; ++i )
	{
		map[0][i] = 'H';
	}

	//输入map
	for (int i = 1; i <= n; ++i)
		scanf("%s", map[i]);

	//初始化数组dp
	for ( int i = 0; i < 60; ++i )
	{
		for ( int j = 0; j < 60; ++j )
		{
			for ( int k = 0; k < 102; ++k )
			{
				dp[i][j][k] = -1;
			}
		}
	}

	//dp
	int max = 0;
	for (int i = 0; i < len; ++i)
		for (int j = 0; j < len; ++j)
		{
			bool b = true;
			if ((st[i]&st[j]) != 0)
				continue;
			for (int k = 0; k < m; ++k)
			{
				if (map[n][k] == 'H' && (st[i]&(1<<k)) != 0)
				{
					b = false;
					break;
				}
				if (map[n-1][k] == 'H' && (st[j]&(1<<k)) != 0)
				{
					b = true;
					break;
				}
			}
			if (b)
			{
				int tt = f(i,j,n);
				max = max > tt ? max : tt;
			}
		}
		printf("%d\n",max);
		return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator