Beyond the Void
BYVoid
USACO 5.3.4 Big Barn 巨大的牛棚 bigbrn
本文正體字版由OpenCC轉換

動態規劃。前面的章節中還有一個與這個基本上一樣的題。

  • 狀態 o F[i][j] 表示以(i,j)爲左上角最大正方形的邊長

  • 初始條件 o 如果(i,N)沒有障礙 F[i][N]=1 否則 F[i][N]=0 o 如果(N,i)沒有障礙 F[N][i]=1 否則 F[N][i]=0

  • 狀態轉移方程 o F[i][j]=min(F[i+1][j],F[i][j+1],F[i+1][j+1])+1;

    USER: CmYkRgB123 CmYkRgB123 [cmykrgb1]
      TASK: bigbrn
      LANG: C++
        
      Compiling...
      Compile: OK
        
      Executing...
         Test 1: TEST OK [0.011 secs, 6752 KB]
         Test 2: TEST OK [0.000 secs, 6752 KB]
         Test 3: TEST OK [0.000 secs, 6756 KB]
         Test 4: TEST OK [0.000 secs, 6756 KB]
         Test 5: TEST OK [0.000 secs, 6756 KB]
         Test 6: TEST OK [0.000 secs, 6752 KB]
         Test 7: TEST OK [0.000 secs, 6752 KB]
         Test 8: TEST OK [0.011 secs, 6756 KB]
         Test 9: TEST OK [0.011 secs, 6756 KB]
         Test 10: TEST OK [0.032 secs, 6752 KB]
         Test 11: TEST OK [0.032 secs, 6752 KB]
         Test 12: TEST OK [0.032 secs, 6756 KB]
         Test 13: TEST OK [0.022 secs, 6756 KB]
         Test 14: TEST OK [0.022 secs, 6752 KB]
         Test 15: TEST OK [0.043 secs, 6752 KB]
        
      All tests OK.
      
      Your program ('bigbrn') produced all correct answers!  This is your
      submission #3 for this problem.  Congratulations!
      
      
/*
ID: cmykrgb1
PROG: bigbrn
LANG: C++
*/

#include <iostream>
#include <fstream>
#define MAXN 1001

using namespace std;

ifstream fi("bigbrn.in");
ofstream fo("bigbrn.out");

int M[MAXN][MAXN],N,ans;

void init()
{
	int T,x,y,i;
	fi >> N >> T;
	for (i=1;i<=T;i++)
	{
		fi >> x >> y;
		M[x][y]=-1;
	}
}

inline int min(int a,int b,int c)
{
	if (a<=b && a<=c) return a;
	if (b<=a && b<=c) return b;
	return c;
}

void dynamic()
{
	int i,j;
	for (i=1;i<=N;i++)
	{
		if (M[N][i]==0)	M[N][i]=1;
		else			M[N][i]=0;
		if (M[i][N]==0)	M[i][N]=1;
		else			M[i][N]=0;
	}
	for (i=N-1;i>=1;i--)
		for (j=N-1;j>=1;j--)
			if (M[i][j]==-1)
				M[i][j]=0;
			else
			{
				M[i][j]=min(M[i+1][j],M[i][j+1],M[i+1][j+1])+1;
				if (M[i][j]>ans)
					ans=M[i][j];
			}
}

void print()
{
	fo << ans << endl;
	fi.close();
	fo.close();
}

int main()
{
	int i,j;
	init();
	dynamic();
	print();
	return 0;
}

上次修改時間 2017-05-22

相關日誌