江湖救急
  • 板块灌水区
  • 楼主linzichen120207
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/1 14:57
  • 上次更新2023/11/3 06:33:53
查看原帖
江湖救急
935855
linzichen120207楼主2023/8/1 14:57

为了让谷民们更容易看题目

我把站外题目复制到了洛谷里

求助站外题

强调一下,这不是宣传私题

代码连样例都过不去:

#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里面

然后输出

没啥问题呀

悬赏关注……

要被折腾亖了

2023/8/1 14:57
加载中...