hdu 2084 数塔

数塔,最最基础的DP,别人都是这么说,个人觉得(因为个人比较菜)要做出来不难

但完完全全理解,分析透彻,还是要仔细想想的说;

其实这道题很久之前就做过一次了,那时虽题目明确给出是DP,但压根没有概念

什么最优子结构,什么子问题重叠性都是浮云,最后还是出了必杀技(百度,goole)才过了;

现在又做一次,看了关于状态的表示(大牛写的,边个就忘了,真不好意思),觉得分析得很好

直接贴上来吧:

状态表示1-1 最自然的作法是用一元组(X)描述问题,D(X)表示从顶到达第X层的得分。但是 /*一元组(X)描述的子问题不能满足最优子结构性质, 因为D(X)的最优解可能不 包含子问题D(X-I)的最优解。这样,动态规划方法是无法在状态表示1-1上应用 的。 状态表示 1-2 用二元组D(X,Y)描述问题,D(X,Y)表示到达第X层第Y个位置时的得分,那么 D(X,Y)的最优解包含了子问题D(X-1,Y)或D(X-1,Y-1)的最优解,状态转 移方程为 D(X,Y)= Max {D(X-1,Y),D(X-1,Y-1)} + A[X,Y] D(1,1)= A[1,1] 这样,最小路径得分可以通过比较底层的分数求得。*/

这里的分析只是最大与最小的差别罢了。我们也可以自底向上分析,最后的D(1,1)就是最大或最小了

 

我的代码:

#include<iostream> using namespace std; int main() { int arr[100][100]; int i,j; int n; int tcase; cin >>tcase; while(tcase--){ cin >>n; for(i = 0;i < n;i++){ for(j = 0; j <= i;j++){ cin >>arr[i][j]; } } for(i = n-1;i > 0;i--){ for(j = i; j > 0; j --){ arr[i-1][j-1] = arr[i][j] > arr[i][j-1]? arr[i-1][j-1]+arr[i][j]:arr[i-1][j-1]+arr[i][j-1]; } } cout <<arr[0][0] <<endl; } return 0; }

 

大牛路过莫喷

你可能感兴趣的:(hdu 2084 数塔)