51nod 1580 铺管道
2017-06-27 22:34
316 查看
分三种情况讨论:
1.直线
2.折一次的折线
3.折2次的折线
有点麻烦的题//#include<bits/stdc++.h>
#include<stdio.h>
#include<cstring>
using namespace std;
const int MAXN=2020;
char mp[MAXN][MAXN];
int dp[4][MAXN][MAXN],cdp[2][MAXN][MAXN];
int main()
{
long long n,m,i,j;
long long ans;
while(~scanf("%lld%lld",&n,&m))
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf(" %c",&mp[i][j]);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(mp[i][j]=='.')
{
if(i==1)
dp[0][i][j]=1;
else
dp[0][i][j]=dp[0][i-1][j];
if(j==1)
dp[1][i][j]=1;
else
dp[1][i][j]=dp[1][i][j-1];
}
else
dp[0][i][j]=dp[1][i][j]=0;
}
}
for(i=n;i>=1;i--)
{
for(j=m;j>=1;j--)
{
if(mp[i][j]=='.')
{
if(i==n)
dp[2][i][j]=1;
else
dp[2][i][j]=dp[2][i+1][j];
if(j==m)
dp[3][i][j]=1;
else
dp[3][i][j]=dp[3][i][j+1];
}
else
dp[2][i][j]=dp[3][i][j]=0;
}
}
ans=0;
for(i=2;i<n;i++)
{
if(dp[1][i][m])
ans++;
}
for(j=2;j<m;j++)
{
if(dp[0]
[j])
ans++;
}
for(i=2;i<n;i++)
{
for(j=2;j<m;j++)
{
if(dp[0][i][j]&&dp[1][i][j])
ans++;
if(dp[0][i][j]&&dp[3][i][j])
ans++;
if(dp[2][i][j]&&dp[1][i][j])
ans++;
if(dp[2][i][j]&&dp[3][i][j])
ans++;
}
}
memset(cdp,0,sizeof(cdp));
for(i=2;i<n;i++)
{
for(j=2;j<m;j++)
{
cdp[0][i][j]+=dp[0][i][j]+dp[2][i][j];
ans+=cdp[0][i][j]*cdp[0][i][j-1];
if(j>=3)
ans-=dp[0][i][j-1]*dp[0][i][j]+dp[2][i][j-1]*dp[2][i][j];
if(mp[i][j]=='.')
cdp[0][i][j]+=cdp[0][i][j-1];
cdp[1][i][j]+=dp[1][i][j]+dp[3][i][j];
ans+=cdp[1][i][j]*cdp[1][i-1][j];
if(i>=3)
ans-=dp[1][i-1][j]*dp[1][i][j]+dp[3][i-1][j]*dp[3][i][j];
if(mp[i][j]=='.')
cdp[1][i][j]+=cdp[1][i-1][j];
}
}
printf("%lld\n",ans);
}
}
1.直线
2.折一次的折线
3.折2次的折线
有点麻烦的题//#include<bits/stdc++.h>
#include<stdio.h>
#include<cstring>
using namespace std;
const int MAXN=2020;
char mp[MAXN][MAXN];
int dp[4][MAXN][MAXN],cdp[2][MAXN][MAXN];
int main()
{
long long n,m,i,j;
long long ans;
while(~scanf("%lld%lld",&n,&m))
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf(" %c",&mp[i][j]);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(mp[i][j]=='.')
{
if(i==1)
dp[0][i][j]=1;
else
dp[0][i][j]=dp[0][i-1][j];
if(j==1)
dp[1][i][j]=1;
else
dp[1][i][j]=dp[1][i][j-1];
}
else
dp[0][i][j]=dp[1][i][j]=0;
}
}
for(i=n;i>=1;i--)
{
for(j=m;j>=1;j--)
{
if(mp[i][j]=='.')
{
if(i==n)
dp[2][i][j]=1;
else
dp[2][i][j]=dp[2][i+1][j];
if(j==m)
dp[3][i][j]=1;
else
dp[3][i][j]=dp[3][i][j+1];
}
else
dp[2][i][j]=dp[3][i][j]=0;
}
}
ans=0;
for(i=2;i<n;i++)
{
if(dp[1][i][m])
ans++;
}
for(j=2;j<m;j++)
{
if(dp[0]
[j])
ans++;
}
for(i=2;i<n;i++)
{
for(j=2;j<m;j++)
{
if(dp[0][i][j]&&dp[1][i][j])
ans++;
if(dp[0][i][j]&&dp[3][i][j])
ans++;
if(dp[2][i][j]&&dp[1][i][j])
ans++;
if(dp[2][i][j]&&dp[3][i][j])
ans++;
}
}
memset(cdp,0,sizeof(cdp));
for(i=2;i<n;i++)
{
for(j=2;j<m;j++)
{
cdp[0][i][j]+=dp[0][i][j]+dp[2][i][j];
ans+=cdp[0][i][j]*cdp[0][i][j-1];
if(j>=3)
ans-=dp[0][i][j-1]*dp[0][i][j]+dp[2][i][j-1]*dp[2][i][j];
if(mp[i][j]=='.')
cdp[0][i][j]+=cdp[0][i][j-1];
cdp[1][i][j]+=dp[1][i][j]+dp[3][i][j];
ans+=cdp[1][i][j]*cdp[1][i-1][j];
if(i>=3)
ans-=dp[1][i-1][j]*dp[1][i][j]+dp[3][i-1][j]*dp[3][i][j];
if(mp[i][j]=='.')
cdp[1][i][j]+=cdp[1][i-1][j];
}
}
printf("%lld\n",ans);
}
}
相关文章推荐
- 51nod 1580 铺管道(折线问题)
- 51Nod-1580-铺管道
- 51nod 1608 管道安装
- 51Nod 1608 管道安装
- UNIX的管道模型
- linux进程间通信----之使用匿名管道
- 51Nod 1135 求一个奇质数的最小原根
- ASP.NET 管道模型
- 有名管道应用(返回字符串)
- linux学习笔记(15) - 管道命令(pipe)
- Linux的管道命令竖线(|)
- 51Nod 1087 1 10 100 1000
- 51Nod-1069 Nim游戏
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式等)介绍
- [数论] 51Nod 1225 余数之和
- lcs 51nod 1006 最长公共子序列Lcs
- MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)
- 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?
- 51Nod - 1416 两点
- Linux 进程通信(System V)管道