最初の質問:
問題は、おそらく意図し:(ここでも新しいアレイP)3×Nアレイ、シーケンス内の各列から取得数、最小絶対値は隣接する2つの番号に。
ノート範囲:
例:
输入:
5
5 10 5 4 4
1 7 8 4 0
3 4 9 0 3
输出:
5
解释:
序列为 5 7 5 4 4,最小值为5
:個々の問題の考えを行う
ので結果できRES [I] [J]配列レコード:j番目の列が観察され、現在の数字列が追加されている場合、[I] [j]は、ただ一つトラバーサル、すなわち、
for(int i=1;i<n;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
res[j][i]=min(res[j][i],res[k][i-1]+abs(a[j][i]-a[k][i-1]));
}
}
}
また、我々は、初期化を見てする必要があります。
ときに完全なコード筆記試験(少し醜いと感じ、555):
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+7;
int a[3][MAX_N];
int n;
long long ans;
long long res[3][MAX_N];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n;
for(int i=0;i<3;i++){
for(int j=0;j<n;j++){
cin >> a[i][j];
}
}
//初始化
for(int i=0;i<3;i++){
for(int j=1;j<n;j++){
res[i][j]=1e18;
}
}
for(int i=0;i<3;i++) res[i][0]=0;
//主要过程
for(int i=1;i<n;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
if(a[j][i]>=a[k][i-1]){
if(res[j][i]>res[k][i-1]+a[j][i]-a[k][i-1])
res[j][i]=res[k][i-1]+a[j][i]-a[k][i-1];
}
else{
if(res[j][i]>res[k][i-1]-a[j][i]+a[k][i-1])
res[j][i]=res[k][i-1]-a[j][i]+a[k][i-1];
}
}
}
}
//找最小值
if(res[0][n-1]<res[1][n-1]) ans=res[0][n-1];
else ans=res[1][n-1];
if(res[2][n-1]<ans) ans=res[2][n-1];
cout << ans;
return 0;
}
少し緊張質問、少し間違った手、遅延を行うと。その蓄積された経験!