#include <iostream> #define print \ for(int i = 0; i < rows; ++i) \ {\ for(int j = 0; j < rows; ++j)\ cout << a[i][j] << " ";\ cout << endl;\ } using namespace std; int main() { ios_base::sync_with_stdio(0); int rows; cin >> rows; int s = rows*(rows+1)/2; // int a[2][3]; int **a = new int*[rows]; for(int i = 0; i < rows; ++i) { a[i] = new int[rows]; for(int j = i; j< rows; ++j) cin >> a[i][j]; } // print int min; for(int i = rows - 1; i>=0; --i) { min = a[0][i]; a[i][0] = min; for(int j = 1; j < i; ++j) { if(a[j][i] < min) min = a[j][i]; a[i][j]=min; } } // print long long diagonal = a[0][0]; for(int i = 1; i < rows; ++i) diagonal += (a[i][i-1] > a[i][i]) ? a[i][i] : a[i][i-1]; long long mindiag = diagonal; // cout << diagonal << endl; if(rows <=2) { cout << diagonal << endl; return 0; } mindiag -= (a[rows-1][rows-1] < a[rows - 2][rows-1]) ? a[rows-1][rows-1] : a[rows-2][rows-1]; long long maxdiag = 0; long long edge = 0; for(int i = rows - 2; i>0; --i) { maxdiag = 0; edge = a[i][i]; mindiag -= (a[i][i] < a[i-1][i]) ? a[i][i] : a[i-1][i]; for(int j = i+1; j< rows; j++) { if(a[j][j] > a[i][j]) a[j][j] = a[i][j]; maxdiag += a[j][j]; // edge if(edge > a[j][i]) edge = a[j][i]; } long long sum = mindiag + maxdiag + edge; // cout << "row " << i << "min " << mindiag << " max " << maxdiag << " edge " << edge << endl; if(diagonal > sum) { diagonal = sum; // cout << "row " << i << "min " << mindiag << " max " << maxdiag << " edge " << edge << endl; } } cout << diagonal << endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <iostream> #define print \ for(int i = 0; i < rows; ++i) \ {\ for(int j = 0; j < rows; ++j)\ cout << a[i][j] << " ";\ cout << endl;\ } using namespace std; int main() { ios_base::sync_with_stdio(0); int rows; cin >> rows; int s = rows*(rows+1)/2; // int a[2][3]; int **a = new int*[rows]; for(int i = 0; i < rows; ++i) { a[i] = new int[rows]; for(int j = i; j< rows; ++j) cin >> a[i][j]; } // print int min; for(int i = rows - 1; i>=0; --i) { min = a[0][i]; a[i][0] = min; for(int j = 1; j < i; ++j) { if(a[j][i] < min) min = a[j][i]; a[i][j]=min; } } // print long long diagonal = a[0][0]; for(int i = 1; i < rows; ++i) diagonal += (a[i][i-1] > a[i][i]) ? a[i][i] : a[i][i-1]; long long mindiag = diagonal; // cout << diagonal << endl; if(rows <=2) { cout << diagonal << endl; return 0; } mindiag -= (a[rows-1][rows-1] < a[rows - 2][rows-1]) ? a[rows-1][rows-1] : a[rows-2][rows-1]; long long maxdiag = 0; long long edge = 0; for(int i = rows - 2; i>0; --i) { maxdiag = 0; edge = a[i][i]; mindiag -= (a[i][i] < a[i-1][i]) ? a[i][i] : a[i-1][i]; for(int j = i+1; j< rows; j++) { if(a[j][j] > a[i][j]) a[j][j] = a[i][j]; maxdiag += a[j][j]; // edge if(edge > a[j][i]) edge = a[j][i]; } long long sum = mindiag + maxdiag + edge; // cout << "row " << i << "min " << mindiag << " max " << maxdiag << " edge " << edge << endl; if(diagonal > sum) { diagonal = sum; // cout << "row " << i << "min " << mindiag << " max " << maxdiag << " edge " << edge << endl; } } cout << diagonal << endl; return 0; } |