DP入门,HDU 2084 数塔 参考代码
2011-11-17 22:11
465 查看
HDU 2084 数塔
//DP入门,数塔, HDU 2084 //以C++编译器提交 #include <iostream> using namespace std; #define N 100 int f ; //状态:f[i,j], 算到第i行j列时的最大值 //转移方程:f[i,j]=f[i,j]+max(f[i-1,j],f[i-1,j-1]) //初值:直接输入 //结果:max(f[n-1,j]), 0<=j<n int dpDown(int n)//从上往下算 { int i, j, maxVal; for(i=1;i<n;i++) //第一列只能从上面竖走下来 { f[i][0] = f[i-1][0] + f[i][0]; } for(i=1;i<n;i++)//从第二行开始做 { for(j=1;j<=i;j++) { if (f[i-1][j]>f[i-1][j-1])//斜走、竖走中取大者 f[i][j] = f[i][j] + f[i-1][j]; else f[i][j] = f[i][j] + f[i-1][j-1]; } } //取最后一行中的最大值 maxVal=f[n-1][0]; for(i=1;i<n;i++) { if (maxVal<f[n-1][i]) maxVal=f[n-1][i]; } return maxVal; } //状态:f[i,j], 算到第i行j列时的最大值 //转移方程:f[i,j]=f[i,j]+max(f[i+1,j],f[i+1,j+1]) //初值:直接输入 //结果:f[0,0] int dpUp(int n)//从下往上算 { int i, j; for(i=n-2;i>=0;i--) //从倒数第二行开始做 { for(j=0;j<=i;j++) { if (f[i+1][j]>f[i+1][j+1])//斜走、竖走中取大者 f[i][j] += f[i+1][j]; else f[i][j] += f[i+1][j+1]; } } return f[0][0]; } void run() { int i, j, n, res; scanf("%d", &n); for(i=0;i<n;i++) { for(j=0;j<=i;j++) { scanf("%d", &f[i][j]); } } //res=dpDown(n); res=dpUp(n); printf("%d\n", res); } int main() { #ifndef ONLINE_JUDGE freopen("e:\\input.txt","r",stdin); #endif int i, n; scanf("%d", &n); for(i=0;i<n;i++) run(); return 0; }
相关文章推荐
- HDU 2084 数塔 dp入门
- [HDU] 2084 数塔 - 入门dp
- hdu 2084 dp入门 数塔问题
- HDU 2084 数塔(简单DP入门)
- HDU-2084 数塔(简单DP入门)
- HDU - 2084 数塔(dp入门)
- HDU 2084 数塔 --- 入门DP
- hdu 2084 dp入门数塔问题
- HDU 1087 Super Jumping! Jumping! Jumping! --- DP入门之最大上升子序列
- hdu 2993 MAX Average Problem(DP+斜率优化入门题)
- HDU 1520 Anniversary party(树形DP入门)
- HDU 1520 Anniversary party 树形dp 入门
- Hdu 2084 数塔 简单DP
- HDU - 2089 不要62(数位DP入门)
- [HDU] 1520 Anniversary party 入门树形DP
- [HDU] 3853 LOOPS 期望dp入门
- HDU 2089 数位DP 入门题
- hdu 2084 数塔(简单的dp)
- 数塔 (dp)HDU - 2084
- HDU 2089 数位DP入门题