La primera pregunta:
Pregunta probablemente destinado: a una matriz de 3 * n, un número tomado de cada columna en secuencia (aquí también una nueva matriz p), el valor mínimo absoluto y dos números adyacentes.
rango de notas:
Un ejemplo:
输入:
5
5 10 5 4 4
1 7 8 4 0
3 4 9 0 3
输出:
5
解释:
序列为 5 7 5 4 4,最小值为5
: La idea de los problemas individuales hacer
lo que los resultados pueden res [i] [j] registro matriz: se observa j-ésima columna, si se añade la secuencia de número actual a a [i] [j], sólo uno de recorrido, es decir,
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]));
}
}
}
También tenemos que mirar en la inicialización.
Cuando el código escrito prueba completa (se sintiera un poco feo, 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;
}
¿Cuándo se pregunta un poco nervioso, un poco de manos equivocadas, la demora. La experiencia acumulada de ella!