class Solution {
public:
vector<int> getRow(int k) {
vector<int> vts;
if(k == 0){
vts.push_back(1);
return vts;
}
if(k == 1){
vts.push_back(1);
vts.push_back(1);
return vts;
}
for(int i = 0;i<k+1;++i)
{
if(i == 0 ||i == 1){
vts.push_back(1);
} else {// !!!!!
vts.push_back(0);
}
}
for(int p = 2;p<=k;++p){
//for(int col = 1;col<=p;++col){
for(int col = p;col>=1;--col){
if(vts[col] == 0){
vts[col] = 1;
} else {
vts[col] = vts[col]+vts[col-1];
}
}
}
return vts;
}
};
public:
vector<int> getRow(int k) {
vector<int> vts;
if(k == 0){
vts.push_back(1);
return vts;
}
if(k == 1){
vts.push_back(1);
vts.push_back(1);
return vts;
}
for(int i = 0;i<k+1;++i)
{
if(i == 0 ||i == 1){
vts.push_back(1);
} else {// !!!!!
vts.push_back(0);
}
}
for(int p = 2;p<=k;++p){
//for(int col = 1;col<=p;++col){
for(int col = p;col>=1;--col){
if(vts[col] == 0){
vts[col] = 1;
} else {
vts[col] = vts[col]+vts[col-1];
}
}
}
return vts;
}
};
for this one; we must add from the end to the beginning.
if we add from the beginning to the end;
for instance from 1,2,1 to 1,3,3,1
if we add from beginning to the end;
we will get
1,3,4,4; so it is wrong;
add from the ending will not influence the value behind;
从前往后:
当前值的改变 会影响后面的值;
从后往前:
当前值的改变 不会影响后面的值;
================
无后效性是一个问题可以用
动态规划求解的标志之一。
它是这样一种性质:某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响,简单的说,就是“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。具体地说,如果一个问题被划分各个阶段之后,阶段I中的状态只能由阶段I-1中的状态通过状态转移方程得来,与其它状态没有关系,特别是与未发生的状态没有关系。从图论的角度去考虑,如果把这个问题中的状态定义成图中的顶点,两个状态之间的转移定义为边,转移过程中的权值增量定义为边的权值,则构成一个有向无环加权图,因此,这个图可以进行“拓扑排序”,至少可以按它们拓扑排序的顺序去划分阶段。