int dp[109][161][161];
char mp[109][15];
int sta[61];//
int nn[61];
void init()
{
int tol=0, i, j;
for(i=0; i<=1024; i++)
{
int num = 0;
for(j=0; j<10; j++)
{
int x = 1<<j;
int y = 1<<(j+1);
int z = 1<<(j+2);
if(x&i)
{
if( (y&i) || (z&i) ) break;
else num++;
}
}
if(j>=10)
{
sta[tol] = i;
nn[tol++] = num;
}
}
}
bool can(int i, int state)
{
int j = 0;
while(state)
{
if( (state&1) && mp[i][j]=='H') return false;
state>>=1;
j++;
}
return true;
}
bool can1(int s1, int s2)
{
while(s1 && s2)
{
if(s1&1 && s2&1) return false;
s1>>=1;
s2>>=1;
}
return true;
}
int main()
{
int n, m, i, j, k, h;
scanf("%d%d", &n, &m);
//memset(dp, 0, sizeof(dp));
init();
for(int i=1; i<=n; i++)
scanf("%s", mp[i]);
int s = 1<<m;
for(i=1; i<=n; i++)
for(j=0; sta[j]<s; j++)
if (can(i, sta[j]))
{
for(k = 0; sta[k] < s; k++)
if(can1(sta[j], sta[k]))
{
for(h = 0; sta[h] < s; h++)
if(can1(sta[j], sta[h]))
{
dp[i][j][k] = max(dp[i][j][k], dp[i-1][k][h] + nn[j]);
}
}
}
int ans = 0;
for(j = 0; sta[j] < s; j++)
{
for(k = 0; sta[k] < s; k++)
{
ans = max(ans, dp[n][j][k]);
}
}
printf("%d\n", ans);
return 0;
}
POJ-1185-状态dp
最新推荐文章于 2019-04-09 17:21:27 发布