给定一个三角矩阵 从最上层到最下层的距离最小,下层选择的数和上层选择的数必须是相邻的
思路:
这是一个典型的DP问题,如果设定dp[i][j]表示从最上层到当前元素的路径的最小值,那么到矩阵都被设置后,从最后一层中找到最小的即可。
只不过需要注意的是每一层的第一个元素和最后一个元素,因为这两个位置的相邻元素只有一个。初始化dp[0][0]为三角矩阵的第一个元素的值。
int Path(vector<vector<int> >& triangle) { vector<vector<int> > dp(triangle.size()); int i,j; int tmp; int min; for(i=0;i<triangle.size();i++) dp[i].assign(triangle.size(),100000); dp[0][0] = triangle[0][0]; for(i=1;i<triangle.size();i++) for(j=0;j<=i;j++) { if(j ==0) { dp[i][j] = dp[i][j] < dp[i-1][j] + triangle[i][j]? dp[i][j]:dp[i-1][j] + triangle[i][j]; } else if(j ==i) { dp[i][j] = dp[i][j] < dp[i-1][j-1]+triangle[i][j] ? dp[i][j]:dp[i-1][j-1] + triangle[i][j]; } else { tmp = (dp[i-1][j-1]+triangle[i][j] ) < (dp[i-1][j]+triangle[i][j]) ? (dp[i-1][j-1]+triangle[i][j]):(dp[i-1][j]+triangle[i][j]); dp[i][j] = dp[i][j] < tmp ? dp[i][j]:tmp; } } tmp = triangle.size()-1; min = dp[tmp][0]; for(i=0;i<tmp;i++) if(dp[tmp][i]<min) min = dp[tmp][i]; return min; } int main() { vector<vector<int> > triangle(4); int i,j; srand(rand()%100000); for(i=1;i<=4;i++) triangle[i-1].assign(i,0); for(i=0;i<triangle.size();i++) for(j=0;j<i+1;j++) triangle[i][j] = rand()%20; /* triangle[0][0]=2; triangle[1][0]=3; triangle[1][1]=4; triangle[2][0]=6; triangle[2][1]=5; triangle[2][2]=7; triangle[3][0]=4; triangle[3][1]=1; triangle[3][2]=8; triangle[3][3]=3; */ for(i=0;i<triangle.size();i++) { for(j=0;j<i+1;j++) cout<<triangle[i][j]<<" "; cout<<endl; } cout<<"+++++++"<<endl; cout<<Path(triangle)<<endl; return 0; }
原文:http://blog.csdn.net/yusiguyuan/article/details/44625947