dp_基础_数字三角形
题
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
问:最大和是多少。
思路图解
设dp[i][j]
i 为第i 行,j 为 第i行的第j个数字时。
则有
无后效性:向下选择的时候不会影响之前的选择
子问题重叠:使用dp[i-1] 来代表上一行已经选好的结果
最优子结构:dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + nums[j];
此外可用滚动数组来优化
附:http://poj.org/problem?id=1163 ac答案
#define NMAX 110
int nums[NMAX];
int ret[NMAX];
int main(){
int n;
scanf("%d",&n);
int retn = 0;
for( int i=0;i<n;++i){
for( int j=0;j<=i;++j){
scanf("%d",&nums[j]);
}
for( int j=i;j>0;--j){//使用倒序,如果是正序,则需要2个数组
ret[j] = max(ret[j-1]+nums[j],ret[j]+nums[j]);
retn = max(retn,ret[j]);
}
ret[0] += nums[0];
retn = max(retn,ret[0]);
}
printf("%d\n",retn);
}