#include <iostream> using namespace std; bool isGood(int *cities, int start, int end) { long long sum = 0; for (int i=start;i<end;++i) { sum+=cities[i]; if (i==end-1) { if (sum < 0) return false; sum = 0; } } return true; } void printSplits(int **splits, int row, int n) { for (int i=0;i<n-row;++i) cout << splits[row][i] << " "; cout << endl; } int main() { int n; cin >> n; int *cities = new int[n]; int **splits = new int*[n]; for (int i=0;i<n;++i) { splits[i] = new int[n-i]; } long long sum = 0; for (int i = 0;i<n;i++) { cin >> cities[i]; sum += cities[i]; splits[0][i] = (cities[i]>=0?0:-1); } for (int i=1;i<n;++i) { for (int j=0;j<n-i;++j) { if (!isGood(cities,j,j+i+1)) { splits[i][j]=-1; continue; } splits[i][j]=i; for (int k=0;k<i;++k) { if (splits[k][j] == -1 || splits[i-k-1][j+k+1] == -1) continue; if (splits[k][j]+splits[i-k-1][j+k+1] < splits[i][j]) splits[i][j]=splits[k][j]+splits[i-k-1][j+k+1]; } } } cout << splits[n-1][0] << endl; delete[] cities; for (int i=0;i<n;++i) delete[] splits[i]; delete[] splits; 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 | #include <iostream> using namespace std; bool isGood(int *cities, int start, int end) { long long sum = 0; for (int i=start;i<end;++i) { sum+=cities[i]; if (i==end-1) { if (sum < 0) return false; sum = 0; } } return true; } void printSplits(int **splits, int row, int n) { for (int i=0;i<n-row;++i) cout << splits[row][i] << " "; cout << endl; } int main() { int n; cin >> n; int *cities = new int[n]; int **splits = new int*[n]; for (int i=0;i<n;++i) { splits[i] = new int[n-i]; } long long sum = 0; for (int i = 0;i<n;i++) { cin >> cities[i]; sum += cities[i]; splits[0][i] = (cities[i]>=0?0:-1); } for (int i=1;i<n;++i) { for (int j=0;j<n-i;++j) { if (!isGood(cities,j,j+i+1)) { splits[i][j]=-1; continue; } splits[i][j]=i; for (int k=0;k<i;++k) { if (splits[k][j] == -1 || splits[i-k-1][j+k+1] == -1) continue; if (splits[k][j]+splits[i-k-1][j+k+1] < splits[i][j]) splits[i][j]=splits[k][j]+splits[i-k-1][j+k+1]; } } } cout << splits[n-1][0] << endl; delete[] cities; for (int i=0;i<n;++i) delete[] splits[i]; delete[] splits; return 0; } |