USACO 5.3.4 Big Barn (DP)

USACO 5.3.4 Big Barn (DP)

比较简单的DP。和3.3的Home on the Range差不多. 还简单些。

初始状态
f(i,n) = 1, (i,n)没树;f(i,n)=0,(i,n)有树。
f(n,i) = 1, (i,n)没树;f(i,n)=0,(i,n)有树。

状态转移方程:
i->n-1...1
j->n-1...1
若(i,j)没树
f[i,j] = min3(f[i+1][j], f[i][j+1], f[i+1][j+1])+1

记录最大的f[i,j]即可。

/**/ /*
ID: lorelei3
TASK: bigbrn
LANG: C++
*/


#include 
< fstream >

using   namespace  std;

const   int  MAXN  =   1005 ;

ifstream fin(
" bigbrn.in " );
ofstream fout(
" bigbrn.out " );

int  f[MAXN][MAXN];

inline 
int  min3( int  a,  int  b,  int  c) {
    
int t=a<b?a:b;
    
return c<t?c:t;
}


int  main() {
    
int i,j,n, t, ans=1;



    fin
>>n>>t;

    
for(i=1; i<=n; ++i)
        
for(j=1; j<=n; ++j)
            f[i][j]
=-1;

    
for(i=0; i<t; ++i){
        
int a,b;
        fin
>>a>>b;
        f[a][b]
=0;
    }


    
for(i=1; i<=n; ++i){
        
if(f[i][n]!=0)
            f[i][n]
=1;
        
if(f[n][i]!=0)
            f[n][i]
=1;
    }


    
for(i=n-1; i>=1--i)
        
for(j=n-1; j>=1--j)
            
if(f[i][j]!=0){
                f[i][j]
=min3(f[i+1][j], f[i][j+1], f[i+1][j+1])+1;
                
if(f[i][j]>ans)
                    ans
=f[i][j];
            }


    fout
<<ans<<endl;

    
return 0;
}

你可能感兴趣的:(USACO 5.3.4 Big Barn (DP))