Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
struct data { int i; int j; int val; friend bool operator<(data& d1, data& d2) { return d1.val < d2.val; } }; class minpq { public: minpq(int n,int m) { pq = new data[m*n]; size = 0; this->n = n*m; } ~minpq() { delete[] pq; } bool is_empty() const {return size==0;} data del_min() { data res = pq[0]; swap(0,size-1); size--; sink(0,size-1); return res; } void insert(int i, int j, int val) { pq[size].i = i; pq[size].j = j; pq[size].val = val; size++; swim(size-1); } void sink(int loc, int end) { while(loc<end) { int k=2*loc+1; if(k>end) return; if(k<end && pq[k+1]<pq[k]) k++; if(pq[loc] < pq[k]) return ; swap(loc,k); loc = k; } } void swim(int loc) { while(loc >0) { int k = (loc-1)/2; if(pq[k]<pq[loc]) return; swap(loc,k); loc = k; } } private: data* pq; int size; int n; void swap(int i, int j) { data temp = pq[i]; pq[i] = pq[j]; pq[j] = temp; } }; class Solution { public: int minPathSum(vector<vector<int> > &grid) { int n = grid.size(); if(n == 0) return 0; int m = grid[0].size(); vector<vector<int>> res; vector<vector<bool>> flag; for(int i=0; i<n; i++) { vector<int> temp(m,-1); vector<bool> f(m,false); res.push_back(temp); flag.push_back(f); } minpq q(n,m); q.insert(0,0,grid[0][0]); while(!q.is_empty()) { data temp = q.del_min(); int i=temp.i; int j=temp.j; int val = temp.val; res[i][j] = val; if(flag[i][j] == false) { flag[i][j] = true; if(i == (n-1) && j == (m-1)) return val; if(i+1<n) q.insert(i+1,j,grid[i+1][j]+val); if(j+1<m) q.insert(i,j+1,grid[i][j+1]+val); } } return res[n-1][m-1]; } };
原文地址:http://blog.csdn.net/shaya118/article/details/42643779