以下のコードのようにmain関数内に巨大な配列を定義すると強制終了します.
C++
1#include <bits/stdc++.h> 2 3#define _overload3(_1,_2,_3,name,...) name 4#define _rep(i,n) repi(i,0,n) 5#define repi(i,a,b) for(int i=int(a);i<int(b);++i) 6#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__) 7 8#define MOD 1000000007 9 10using namespace std; 11typedef long long ll; 12 13int main(){ 14 char s[2000][2000]; 15 int dp[2000][2000], x[2000][2000], y[2000][2000], z[2000][2000]; 16 17 int h,w; cin >> h >> w; 18 rep(i,h) rep(j,w) cin >> s[i][j]; 19 20 dp[0][0] = 1; 21 22 rep(i,h){ 23 rep(j,w){ 24 if(i == 0 && j == 0) continue; 25 26 if(s[i][j] == '.'){ 27 if(j-1 >= 0) x[i][j] = (x[i][j-1] + dp[i][j-1]) % MOD; 28 if(i-1 >= 0) y[i][j] = (y[i-1][j] + dp[i-1][j]) % MOD; 29 if(i-1 >= 0 && j-1 >= 0) z[i][j] = (z[i-1][j-1] + dp[i-1][j-1]) % MOD; 30 dp[i][j] = (x[i][j] + y[i][j]) % MOD; 31 dp[i][j] = (dp[i][j] + z[i][j]) % MOD; 32 } 33 } 34 } 35 36 cout << dp[h-1][w-1] << endl; 37}
しかし,以下のようにmain関数の外側に巨大な配列を定義すると強制終了を回避することが出来ます.
C++
1#include <bits/stdc++.h> 2 3#define _overload3(_1,_2,_3,name,...) name 4#define _rep(i,n) repi(i,0,n) 5#define repi(i,a,b) for(int i=int(a);i<int(b);++i) 6#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__) 7 8#define MOD 1000000007 9 10using namespace std; 11typedef long long ll; 12 13char s[2000][2000]; 14int dp[2000][2000], x[2000][2000], y[2000][2000], z[2000][2000]; 15 16int main(){ 17 int h,w; cin >> h >> w; 18 rep(i,h) rep(j,w) cin >> s[i][j]; 19 20 dp[0][0] = 1; 21 22 rep(i,h){ 23 rep(j,w){ 24 if(i == 0 && j == 0) continue; 25 26 if(s[i][j] == '.'){ 27 if(j-1 >= 0) x[i][j] = (x[i][j-1] + dp[i][j-1]) % MOD; 28 if(i-1 >= 0) y[i][j] = (y[i-1][j] + dp[i-1][j]) % MOD; 29 if(i-1 >= 0 && j-1 >= 0) z[i][j] = (z[i-1][j-1] + dp[i-1][j-1]) % MOD; 30 dp[i][j] = (x[i][j] + y[i][j]) % MOD; 31 dp[i][j] = (dp[i][j] + z[i][j]) % MOD; 32 } 33 } 34 } 35 36 cout << dp[h-1][w-1] << endl; 37}
これはなぜなのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。