競プロで、変数の宣言の真下で入力を代入しないとエラーになるのですが、その理由などを教えていただきたいです。
解決したいこと
競プロの入力について質問があります。まず一番伺いたいことから申し上げると、ある変数に入力を代入したい場合、変数を宣言した真下に「cin >> (変数名)」としなけレバならならず、間に他の入力に使う変数などの宣言を挟んではいけないのかということについて伺いたいです。次点として、下のエラーについてどんなもので原因はなんなのかを教えていただきたいです。
(私はプログラミング歴1ヶ月競プロ歴2週間弱の理系大学生で経験が浅いので、全く的外れなことを聞いてしまっているかもしれないのですが、そこはご容赦ください。)
このように疑問を持った経緯としては
https://atcoder.jp/contests/dp/tasks/dp_c
の問題を解いて提出した際、エラーが起き、その原因を検証していたというものがあります。結果としては、以下のような入力のコードの違いによりエラーが起こっているのだとわかりました。その違いとは「int main(){int N;」の次のコードが入力か二次元配列の宣言かという違いです。
実行時エラーの起きたコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int N;
vector< vector <long long>> hapi(N,vector<long long>(3));
cin>>N;
for (int x=0;x<N;x++){
for (int y=0;y<3;y++){
cin>>hapi[x][y];
}
}
//definition of DP
vector <vector<long long>> dp(N+1,vector<long long>(3,0));
for(int i=0;i<N;i++){
dp[i+1][0]=max(dp[i][1],dp[i][2])+hapi[i][0];
dp[i+1][1]=max(dp[i][0],dp[i][2])+hapi[i][1];
dp[i+1][2]=max(dp[i][1],dp[i][0])+hapi[i][2];
}
int A=max(dp[N][0],max(dp[N][1],dp[N][2]));
cout<<A<<endl;
}
エラー画像
正解を得られたソースコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int N;
cin>>N;
vector< vector <long long>> hapi(N,vector<long long>(3));
for (int x=0;x<N;x++){
for (int y=0;y<3;y++){
cin>>hapi[x][y];
}
}
//definition of DP
vector <vector<long long>> dp(N+1,vector<long long>(3,0));
for(int i=0;i<N;i++){
dp[i+1][0]=max(dp[i][1],dp[i][2])+hapi[i][0];
dp[i+1][1]=max(dp[i][0],dp[i][2])+hapi[i][1];
dp[i+1][2]=max(dp[i][1],dp[i][0])+hapi[i][2];
}
int A=max(dp[N][0],max(dp[N][1],dp[N][2]));
cout<<A<<endl;
}
0