アリ、最初の質問筆記試験--3.25 100%

最初の質問:

問題は、おそらく意図し:(ここでも新しいアレイP)3×Nアレイ、シーケンス内の各列から取得数、最小絶対値は隣接する2つの番号に。
Σ | P [ ] - P [ - 1 ] | \合計| P [i]は-p [I-1] |
ノート範囲: 1 n個 1 E 5 1 \当量のn \ leq1e5
例:

输入:
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]は、ただ一つトラバーサル、すなわち、 R E 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] = \分\ {RES [K] [J-1] + ABS([I] [J] -a [K] [J-1])\}(0 \当量のK \当量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]));             
        }        
    }
}

また、我々は、初期化を見てする必要があります。
ときに完全なコード筆記試験(少し醜いと感じ、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;
}

少し緊張質問、少し間違った手、遅延を行うと。その蓄積された経験!

リリース元の2件の記事 ウォンの賞賛4 ビュー88

おすすめ

転載: blog.csdn.net/weixin_41923381/article/details/105104772