uvalive5790(DP)
2015-08-18 09:03
260 查看
题意:
给出一个数字三角形,你如果想要取出一个格子的数字,必须把这个格子的父亲都取走,问你能取走的最大值。
思路:
想到如下的转化:
我们就可以把此题变成在第二个图形上选择矩形,具体细节请看代码。
代码:
给出一个数字三角形,你如果想要取出一个格子的数字,必须把这个格子的父亲都取走,问你能取走的最大值。
思路:
想到如下的转化:
我们就可以把此题变成在第二个图形上选择矩形,具体细节请看代码。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int sum[1005][1005]; int dp[1005][1005]; int num[1005][1005]; int main() { int n; while(scanf("%d",&n)!=EOF) { if(n==0) return 0; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { scanf("%d",&num[i-j+1][j]); } } // for(int i=1;i<=n;i++) // { // for(int j=1;j<=n-i+1;j++) // printf("%d ",num[i][j]); // printf("\n"); // } // memset(sum,0,sizeof sum); for(int i=1;i<=n;i++) { for(int j=1;j<=n-i+1;j++) { sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+num[i][j]; } } // printf("----------------\n"); // for(int i=1;i<=n;i++) // { // for(int j=1;j<=n-i+1;j++) // printf("%d ",sum[i][j]); // printf("\n"); // } // printf("----------------\n"); int ans=0; memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) { int tmpj=n-i+2; for(int j=n-i+1;j>=1;j--) { if(dp[i-1][j]>dp[i-1][tmpj]) tmpj=j; dp[i][j]=dp[i-1][tmpj]+sum[i][j]-sum[i-1][j]; //if(dp[i][j]==6) // printf("%d %d\n",i,j); ans=max(dp[i][j],ans); } } printf("%d\n",ans); } return 0; }
相关文章推荐
- win7 64 位下Navicat11.1.8 (64位) for oracle11g r2 提示 cannot load OCI DLL,126 193的解决方法
- 输入先序和中序构造二叉树
- 串口之DCB结构体详解
- 窥探Swift之别样的枚举类型
- aliyun source.list
- Blue Jeans
- db2 专用工具 版本设置sql自动提示
- 【Android】HTTP里的线程问题
- 统计同成绩学生人数
- 如何在android应用程序中启动其他apk程序,被启动程序退出后返回之前的程序?
- 学习方法-暗时间
- HDOJ-2680-Choose the best route(最短路)
- HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
- 深入理解Java中为什么内部类可以访问外部类的成员
- 关于百度排名点击器作弊提升百度排名的说明
- PowerPC PPC460-S MMU(二)
- hdu5379(2015多校7)--Mahjong tree(构造+dfs)
- 一周 GNOME 之旅:品味它和 KDE 的是是非非(第二节 GNOME桌面)
- hdoj 2594 Simpsons’ Hidden Talents 【KMP】【求串的最长公共前缀后缀】
- linux下安装Mysql(RPM安装)