Editorial for Táo chuối


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của ladpro98

#include <bits/stdc++.h>
const int N = 1505;
const int oo = 1000000009;
using namespace std;
int F[N][N], up[N][N], down[N][N], u[N][N], d[N][N];
int m, n;

int main()
{
    scanf("%d %d\n", &m, &n);
    int i, j; char c = ' ';
    for(i=1; i<=m; i++) {
        for(j=1; j<=n; j++) {
            while (c != 'A' && c != 'B') scanf("%c", &c);
            if (c == 'A') scanf("%d", &d[i][j]); else scanf("%d", &u[i][j]);
            scanf("%c", &c);
        }
        //scanf("\n");
    }
    for(i=1; i<=m; i++) for(j=1; j<=n; j++) {
        down[i][j] = down[i][j-1] + d[i][j];
        up[i][j] = up[i-1][j] + u[i][j];
    }
    for(i=1; i<=m; i++) F[i][1] = 0;
    for(j=1; j<=n; j++) F[1][j] = 0;
    for(i=2; i<=m; i++) for(j=2; j<=n; j++)
        F[i][j] = max(max(F[i-1][j] + down[i][j-1], F[i][j-1] + up[i-1][j]), F[i-1][j-1] + down[i][j-1] + up[i-1][j]);
    cout << F[m][n];
    return 0;
}

Code mẫu của skyvn97

#include<bits/stdc++.h>
#define MAX   1515
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;i=i+1)
#define REP(i,n) for (int i=0,_n=(n);i<_n;i=i+1)
using namespace std;
int a[MAX][MAX],sa[MAX][MAX],sb[MAX][MAX],f[MAX][MAX],m,n;
int readint(void) {
    char s[10];
    scanf("%s",s);
    int sign=s[0]=='A'?-1:1;
    if (strlen(s)==2) return (sign*(s[1]-'0'));
    return (sign*(10*(s[1]-'0')+s[2]-'0'));
}
void init(void) {
    scanf("%d%d",&m,&n);
    FOR(i,1,m) FOR(j,1,n) a[i][j]=readint();
    FOR(i,1,m) FOR(j,1,n) {
        sa[i][j]=sa[i][j-1]+(a[i][j]<0?-a[i][j]:0);
        sb[i][j]=sb[i-1][j]+(a[i][j]>0?a[i][j]:0);
    }
}
void optimize(void) {
    FOR(i,1,m) FOR(j,1,n) {
        if (i>1 && j>1) f[i][j]=f[i-1][j-1]+sa[i][j-1]+sb[i-1][j];
        if (i>1) f[i][j]=max(f[i][j],f[i-1][j]+sa[i][j-1]);
        if (j>1) f[i][j]=max(f[i][j],f[i][j-1]+sb[i-1][j]);
    }
    printf("%d",f[m][n]);
}
int main(void) {
    init();
    optimize();
    int n;
    return (scanf("%d",&n)==1);
}

Comments

Please read the guidelines before commenting.


There are no comments at the moment.