Editorial for VOI 11 Bài 1 - Phần thưởng
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.
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 flashmt
#include<iostream> #include<algorithm> #define maxn 1001 #define f(a,b,c) for (a=b;a<=c;a++) using namespace std; int n,k,i,j,re,x,a[maxn][maxn]; int main() { cin >> n >> k; f(i,1,n) f(j,1,n) { scanf("%d",&x); a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+x; if (i>=k && j>=k) re=max(re,a[i][j]-a[i-k][j]-a[i][j-k]+a[i-k][j-k]); } cout << re << endl; return 0; }
Code mẫu của happyboy99x
#include <cstdio> #define MAX 1000+5 int f[MAX][MAX], a[MAX][MAX]; int n, k; int max( int a, int b ) { return a > b ? a : b; } int main() { scanf( "%d%d", &n, &k ); for( int i = 0; i < n; ++i ) for( int j = 0; j < n; ++j ) scanf( "%d", &a[i][j] ); for( int i = 0; i <= n; ++i ) for( int j = 0; j <= n; ++j ) f[i][j] = (i||j) ? a[i-1][j-1] + f[i-1][j] + f[i][j-1] - f[i-1][j-1] : 0; int res = 0; for( int i = k; i <= n; ++i ) for( int j = k; j <= n; ++j ) res = max(res, f[i][j] - f[i-k][j] - f[i][j-k] + f[i-k][j-k]); printf( "%d\n", res ); return 0; }
Code mẫu của ladpro98
program hinhvuong; var a,f:array[0..1000,0..1000] of longint; n,i,j,x,y,temp,k,max:longint; begin readln(n,k); for i:=1 to n do begin for j:=1 to n do read(a[i,j]); end; for i:=0 to n do f[i,0]:=0; for j:=1 to n do f[0,j]:=0; for i:=1 to n do for j:=1 to n do f[i,j]:=f[i,j-1]+f[i-1,j]-f[i-1,j-1]+a[i,j]; for x:=1 to n-k+1 do for y:=1 to n-k+1 do begin temp:=f[x+k-1,y+k-1] - f[x-1,y+k-1] - f[x+k-1,y-1] + f[x-1,y-1]; if temp>max then max:=temp; end; write(max); end.
Code mẫu của RR
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <string> #include <deque> #include <complex> #define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++) #define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--) #define REP(i,a) for(int i=0,_a=(a); i<_a; i++) #define ll long long #define F first #define S second #define PB push_back #define MP make_pair using namespace std; const double PI = acos(-1.0); int a[1011][1011], s[1011][1011]; int main() { // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int n, k; scanf("%d %d", &n, &k); FOR(i,1,n) FOR(j,1,n) scanf("%d", &a[i][j]); FOR(i,1,n) FOR(j,1,n) s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]; int best = -1000111000; FOR(i,1,n) FOR(j,1,n) { int ii = i + k - 1, jj = j + k - 1; if (ii > n || jj > n) continue; best = max(best, s[ii][jj] - s[ii][j-1] - s[i-1][jj] + s[i-1][j-1]); } printf("%d\n", best); return 0; }
Code mẫu của hieult
#include <stdio.h> //#include <conio.h> int f[1001][1001],a[1001][1001],g[1001]; int main() { //freopen("BONUS.in","r",stdin); int n,m,kq = 0; scanf("%d %d",&n,&m); for(int i = 1;i<=n;i++) {f[i][1] = 0,g[i]=0;} for(int i = 1;i<=n;i++) for(int j = 1;j<=n;j++) { scanf("%d",&a[i][j]); if(j<=m) f[i][1] += a[i][j]; else f[i][j-m+1] = f[i][j-m]+a[i][j]-a[i][j-m]; } for(int i = 1;i<=n-m+1;i++) for(int j = 1;j<=n;j++) { if(j<=m) g[i] += f[j][i]; else g[i] += f[j][i]-f[j-m][i]; if(g[i]>kq) kq = g[i]; } printf("%d",kq); // getch(); }
Code mẫu của ll931110
#include <algorithm> #include <bitset> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <fstream> #include <iostream> #include <map> #include <queue> #include <set> #include <sstream> #include <stack> #include <utility> #include <vector> using namespace std; int a[1010][1010]; int n,k; int main() { // freopen("BONUS.INP","r",stdin); // freopen("BONUS.OUT","w",stdout); scanf("%d %d", &n, &k); memset(a,0,sizeof(a)); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]); for (int i = 2; i <= n; i++) for (int j = 1; j <= n; j++) a[i][j] += a[i - 1][j]; for (int j = 2; j <= n; j++) for (int i = 1; i <= n; i++) a[i][j] += a[i][j - 1]; int ret = 0; for (int i = k; i <= n; i++) for (int j = k; j <= n; j++) ret = max(ret,a[i][j] - a[i - k][j] - a[i][j - k] + a[i - k][j - k]); printf("%d\n", ret); }
Code mẫu của skyvn97
#include<stdio.h> #define MAX 1500 unsigned long a[MAX][MAX]; unsigned long s[MAX][MAX]; unsigned long max,sum; int n,k,i,j; int main(void) { scanf("%d",&n); scanf("%d",&k); for (i=1;i<=n;i=i+1) for (j=1;j<=n;j=j+1) { scanf("%lu",&a[i][j]); s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]; } max=0; for (i=1;i<=n-k+1;i=i+1) for (j=1;j<=n-k+1;j=j+1) { sum=s[i+k-1][j+k-1]-s[i-1][j+k-1]-s[i+k-1][j-1]+s[i-1][j-1]; if (sum>max) max=sum; } printf("%lu",max); }
Comments