pku 1163 The Triangle(DP)

 

题目大意:从三角形顶部走到三角形底部,走的时候只能按对角走,问途中经过的数字和最大是多少。

分析:简单DP,直接贴代码。

值得提一下的是,为了省空间,状态二维数组在我是用一维数组替代的。为了方便书写,我定义了一个Tran宏。

一开始我写的是#define Tran(i,j) ((i-1)*i/2+j)代码中我使用了Tran(i-1,j),因为宏都是直接替换的,由于运算符优先级的关系,就出了问题。

解决办法也很简单,就是加括号。#define Tran(i,j) ((i-1)*(i)/2+j)

#include <iostream> using namespace std; #define Tran(i,j) ((i-1)*(i)/2+j) #define Max(i,j) (i>j?i:j) short triangle[5055]; int state[5055]; int rows,ans; int test,test2; int main() { scanf("%d",&rows); for(int i=1;i<=rows;i++) { for(int j=1;j<=i;j++) { scanf("%hd",&triangle[Tran(i,j)]); } } state[Tran(1,1)]=triangle[Tran(1,1)]; for(int i=2;i<=rows;i++) { state[Tran(i,1)]=state[Tran(i-1,1)]+triangle[Tran(i,1)]; for(int j=2;j<i;j++) { state[Tran(i,j)]=Max(state[Tran(i-1,j-1)],state[Tran(i-1,j)])+triangle[Tran(i,j)]; } state[Tran(i,i)]=state[Tran(i-1,i-1)]+triangle[Tran(i,i)]; } ans=0; for(int i=Tran(rows,1);i<=Tran(rows,rows);i++) { ans=Max(ans,state[i]); } printf("%d/n",ans); return 0; }  

 

你可能感兴趣的:(pku 1163 The Triangle(DP))