Ali, la primera pregunta escrita prueba --3.25 100%

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.
Σ | pag [ yo ] - pag [ yo - 1 ] | \ Sum | p [i] -p [i-1] |
rango de notas: 1 norte 1 mi 5 1 \ leq n \ leq1e5
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, r mi s [ i ] [ j ] = min { r e s [ k ] [ j 1 ] + a b s ( a [ i ] [ j ] a [ k ] [ j 1 ] ) } 0 k 2 res [i] [j] = \ min \ {res [k] [j-1] + abs (a [i] [j] -a [k] [j-1]) \} (0 \ leq k \ leq 2)

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!

Liberadas dos artículos originales · ganado elogios 4 · vistas 88

Supongo que te gusta

Origin blog.csdn.net/weixin_41923381/article/details/105104772
Recomendado
Clasificación