Cod sursa(job #858203)

Utilizator razvan.popaPopa Razvan razvan.popa Data 18 ianuarie 2013 17:58:03
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<iostream>
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<algorithm>
#define INF (1 << 30)
#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define ll long long
#define nxt (*it)
#define type int
#define FORi(i,a,b)\
   for(int i=a; i<=b; ++i)
#define FORr(g)\
   for(vector<type>::reverse_iterator it=g.rbegin(); it!=g.rend(); ++it)
#define FOR(g)\
   for(vector<type>::iterator it=g.begin(); it!=g.end(); ++it)
#define infile "lacusta.in"
#define outfile "lacusta.out"
#define nMax 105
using namespace std;

int A[nMax][nMax], DP[nMax][nMax];

int M, N, Sol = INF;

int min1, min2, i1;

void read(){
    ifstream f(infile);

    f >> M >> N;

    FORi(i,1,M)
       FORi(j,1,N)
          f >> A[i][j];

    f.close();
}

void saveMin(int v, int pos){
    if(v < min1){
        min2 = min1;
        min1 = v;
        i1 = pos;
        }
    else if(v < min2)
        min2 = v;
}

void solve(){
    DP[2][1] = INF;
    FORi(j,2,N)
       DP[2][j] = A[1][1] + A[1][j] + A[2][j];

    FORi(i,3,M){
        min1 = min2 = INF;

        FORi(j,1,N)
            saveMin(DP[i-1][j], j);

        FORi(j,1,N){
            if(i1 != j)
               DP[i][j] = min1 + A[i-1][j] + A[i][j];
            else
               DP[i][j] = min2 + A[i-1][j] + A[i][j];
        }
    }
    FORi(i,1,N-1)
       Sol = min(Sol, DP[M][i]);
    Sol += A[M][N];
}


void print(){
    ofstream g(outfile);

    g << Sol << '\n';

    g.close();
}

int main(){
    read();
    solve();
    print();

    return 0;
}