Logo UKBwyx的博客

博客

月赛第4题100分写法

2023-04-08 21:20:56 By UKBwyx

不知道用的是什么方法(可能是深搜和dp???) 代码...写的很乱 希望你能看懂,还有别在意奇怪的变量名。 对了,问下,scanf怎么用???(数组的3001可以改成1001)

思路:每次从0到1就增加一次,直到终点,但搜索超时,所以保存一下从每个点到终点所需要的次数(最少)

#include<bits/stdc++.h>
using namespace std;
int a[3001][3001];
int u[3001][3001];
bool awsl[3001][3001];
bool ee;
int f(int c,int k,int s,int x,int y,bool p) {
    if(awsl[x][y]) {
        int rrrr=0;
        if(ee==false&&a[x][y]==1) {
            rrrr=1;
        }
        return s+u[x][y]+rrrr;
    }
    long long g=1919810114514,d=1919810114514;
    bool e=false;
    bool ahelp=false;
    bool bhelp=false;
    ee=p;
    if(x==k&&y==c) {
        awsl[x][y]=true;
        return s;
    }
    if((x+1)<=k) {
        if(a[x+1][y]!=p) {
            p=!p;
            e=true;
        }
        if(a[x+1][y]==1&&e) {
            g=f(c,k,s+1,x+1,y,p);
            ahelp=true;
        } else {
            g=f(c,k,s,x+1,y,p);
        }
    }
    if(e) {
        e=!e;
        p=!p;
    }
    if((y+1)<=c) {
        if(a[x][y+1]!=p) {
            p=!p;
            e=true;
        }
        if(a[x][y+1]==1&&e) {
            d=f(c,k,s+1,x,y+1,p);
            bhelp=true;
        } else {
            d=f(c,k,s,x,y+1,p);
        }
    }
    if(d>=g) {
        u[x][y]= u[x+1][y];
        if(ahelp)
        {
            u[x][y]++;
        }
        awsl[x][y]=true;
        return g;

    } else {

        u[x][y]=u[x][y+1];
        if(bhelp)
        {
            u[x][y]++;
        }
        awsl[x][y]=true;
        return d;

    }
}
int main() {
    int n,i,c,k,j,t;
    cin>>n;
    int g[n+1];
    for(i=1; i<=n; i++) {
        scanf("%d%d",&c,&k);
        g[i]=0;
        for(j=1; j<=k; j++) {
            for(t=1; t<=c; t++) {
                scanf("%d",&a[j][t]);
                u[j][t]=0;
                awsl[j][t]=false;
            }
        }
        if(a[1][1]==1) {
            g[i]++;
            g[i]+=f(c,k,0,1,1,1);
        } else {
            g[i]+=f(c,k,0,1,1,0);
        }
    }
    for(i=1; i<=n; i++) {
        printf("%d\n",g[i]);
    }
    return 0;
}

(感觉写的很奇怪,算了,不管了) (感觉没用的东西好多呀,等哪个人来改改吧)

评论

UKBwyx
*,真的会有人看吗

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。