为了让谷民们更容易看题目
我把站外题目复制到了洛谷里
求助站外题
强调一下,这不是宣传私题
代码连样例都过不去:
#include<bits/stdc++.h>
using namespace std;
int t,n,m,a[1005][1005];
int dpu[1005][1005],dpl[1005][1005],dpr[1005][1005],dpd[1005][1005];
long long sum;
int main(){
cin>>t;
for(int i=1;i<=t;i++){
cin>>n>>m;
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++){
cin>>a[j][k];
}
}
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++){
if(a[j][k]==1){
dpu[j][k]=dpu[j-1][k]+1;
dpl[j][k]=dpl[j][k-1]+1;
}
}
}
for(int j=n;j>0;j--){
for(int k=m;k>0;k--){
if(a[j][k]==1){
dpr[j][k]=dpr[j][k+1]+1;
dpd[j][k]=dpd[j+1][k]+1;
}
}
}
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++){
if(dpu[j][k]>=2&&dpl[j][k]>=2){
int ax=max(dpu[j][k],dpl[j][k]);
int din=min(dpu[j][k],dpl[j][k]);
sum+=min(ax/2,din)-1;
sum+=din/2-1;
}
if(dpd[j][k]>=2&&dpl[j][k]>=2){
int ax=max(dpd[j][k],dpl[j][k]);
int din=min(dpd[j][k],dpl[j][k]);
sum+=min(ax/2,din)-1;
sum+=din/2-1;
}
if(dpd[j][k]>=2&&dpr[j][k]>=2){
int ax=max(dpd[j][k],dpr[j][k]);
int din=min(dpd[j][k],dpr[j][k]);
sum+=min(ax/2,din)-1;
sum+=din/2-1;
}
if(dpu[j][k]>=2&&dpr[j][k]>=2){
int ax=max(dpu[j][k],dpr[j][k]);
int din=min(dpu[j][k],dpr[j][k]);
sum+=min(ax/2,din)-1;
sum+=din/2-1;
}
}
}
cout<<sum<<endl;
sum=0;
}
return 0;
}
思路:
定义四个dp数组,分别表示这个格子的四面优秀序列多长
dp之后再去判断每个格子的四个转角,有多少L型的加在sum里面
然后输出
没啥问题呀
悬赏关注……
要被折腾亖了