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

wa?

Posted by 200892458 at 2009-10-13 22:32:37 on Problem 1185
#include <iostream>
#include <cmath>
using namespace std;
const int large=(1<<10);
int n,m;
int stack[large],len=0;
char map[105][15];
int dp[60][60][101];
int Fun(int now,int last,int n)
{
    int s=0,tmp;
    tmp=stack[now]|stack[last];
    if(dp[now][last][n]!=-1)return dp[now][last][n];
    int i,j;
    for(i=0;i<m;i++)
    {
         if((stack[now]&(~(1<<i)))!=stack[now])s++;
    }
    if(n==1)
    {dp[now][last][n]=s;return s;}
    int MAX=0;
    for(i=0;i<len;i++)
    {
        int flag=1;
        if(stack[i]&tmp)continue;
        for(j=0;j<m;j++)
        {
            if(map[n-2][j]=='H'&&(stack[i]&(~(1<<j)))!=stack[i])
            {
                flag=0;break;
            }
        }
        if(flag){int t=Fun(last,i,n-1);if(MAX<t)MAX=t;}
    }
    MAX+=s;
    dp[now][last][n]=MAX;
    return MAX;
}
bool OK(int a)
{
    if(a<0||a>=m)return false;
    return true;
}
int main()
{
    freopen("input.txt","r",stdin);
    cin>>n>>m;
    len=0;
    int i,k,j;
    int power;
    int MAX=0;
    for(i=0;i<m;i++)map[0][i]='H';
    for(i=1;i<=n;i++){cin>>map[i];}
    power=(1<<m);
    for(i=0;i<power;i++)
    {
        int flag=0;
        for(j=0;j<m;j++)
        {
            if((i&(~(1<<j)))!=i)
            {
                if(OK(j-1)&&(i&(~(1<<j-1)))!=i)
                {flag=1;break;}
                if(OK(j-2)&&(i&(~(1<<j-2)))!=i)
                {flag=1;break;}
                if(OK(j+1)&&(i&(~(1<<j+1)))!=i)
                {flag=1;break;}
                if(OK(j+2)&&(i&(~(1<<j+2)))!=i)
                {flag=1;break;}
            }
        }
        if(!flag)stack[len++]=i;
    }
    for(i=0;i<60;i++)
         for(j=0;j<60;j++)
              for(k=0;k<101;k++)
              dp[i][j][k]=-1;
    for(i=0;i<len;i++)
         for(j=0;j<len;j++)
         {
             int flag=1;
             if(stack[i]&stack[j])continue;
             for(k=0;k<m;k++)
             {
                 if(map[n][k]=='H'&&(stack[i]&(~(1<<k))!=stack[i]))
                 {  flag=0;break;}
                 if(map[n-1][k]=='H'&&(stack[j]&(~(1<<k))!=stack[j]))
                 {  flag=0;break;}
             }
             if(flag)   {int t=Fun(i,j,n);if(MAX<t)MAX=t;};
         }
   cout<<MAX<<endl;
    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