动态规划模型3,数塔问题
2013-02-22 09:09 Dr.Ray 阅读(260) 评论(0) 收藏 举报掌握了三要素方法这道题还是比较容易的。
这道题有一点让我比较混乱,就是正推还是倒推的问题,因为没有特殊限制,所以这道题正推倒推都可以得到正确解,无非是把塔给倒转一下,路径上的最大值还是不变的。但是,如果用正推,在推边缘上的项的状态时,就要多出一个判断上面的项是否在塔中的步骤,而倒推的话是从下面的项推上面的项,无此担忧。最后输出顶点的状态就是答案了。
另外要注意的是在初始化最底层状态时我利用了最底层的下一层的0,在其他题目中这可能会使错误的, 注意验证
代码:
#include<stdio.h> #include<stdlib.h> #include<string.h>
int numtri[1001][1001], opt[1001][1001];
int max(int n, int m) { if(n > m) return n; else return m; }
void init() { memset(numtri, 0, sizeof(numtri)); memset(opt, 0, sizeof(opt)); }
int main() { int n; scanf("%d",&n); init();
for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) { scanf("%d",&numtri[i][j]); } }
//opt[1][1] = numtri[1][1];
for(int i=n; i>=1; i--) { for(int j=1; j<=i; j++) { opt[i][j] = max(opt[i+1][j], opt[i+1][j+1]) + numtri[i][j]; } }
printf("%d\n",opt[1][1]); }
浙公网安备 33010602011771号