组队赛130926 Regionals 2011, Latin America
2013-09-27 21:36
253 查看
B题:从一个三角形中选一些点,求和的最大值,不过如果选某个点,必须先取了这个点上面的两个点。
dp[i][j]表示沿着斜角方向取,包含某个点的最大值。
dp[i][j]=max(max(dp[k][j]),dp[i-1][j-1]+b[i][j]);b[i][j]表示j列从1-i行的和。
这题主要是想到dp[i][j],枚举所有的情况都可以用dp[i][j]来表示。
dp[i][j]表示沿着斜角方向取,包含某个点的最大值。
dp[i][j]=max(max(dp[k][j]),dp[i-1][j-1]+b[i][j]);b[i][j]表示j列从1-i行的和。
这题主要是想到dp[i][j],枚举所有的情况都可以用dp[i][j]来表示。
#include<iostream> #include<cstdio> #include<vector> #include<string> #include<queue> #include<cmath> #include<algorithm> #include<cstring> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 1005 #define INF 0xfffffff #define mem(a,b) memset(a,b,sizeof(a)) #define FOR(i,s,t) for(int i=s;i<=t;i++) #define ull unsigned long long #define ll long long using namespace std; int a[maxn][maxn],b[maxn][maxn];//b[]表示从上到小该列的和 int dp[maxn][maxn];//表示以取改点且以改点为最低点的和的最大值 int main() { int n; while(scanf("%d",&n)&&n!=0) { for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { scanf("%d",&a[i][j]); b[i][j]=b[i-1][j]+a[i][j]; } } memset(dp,0,sizeof(dp)); int ans=0; for(int j=1;j<=n;j++)//从每一列开始 { for(int i=n;i>=j;i--) { if(i==n) { dp[i][j]=dp[i-1][j-1]+b[i][j]; } else dp[i][j]=max(dp[i-1][j-1]+b[i][j],dp[i+1][j]); ans=max(ans,dp[i][j]); } cout<<endl; } printf("%d\n",ans); } return 0; }
相关文章推荐
- javaFX实践-快递查询工具 part 1
- 014、ListActivity
- C++ 强制类型转换
- STL算法库概述
- VS2010+Windows 2008部署网站及asp.net业务系统问题收集
- size_t、sizeof、strlen
- C 语言中处理四舍五入
- 往哪里投~
- 往哪里投~
- 递归快速排序
- OpenGL的多边形分割化
- hdu 3081 (最大流)
- PCL-Kinfu编译手册
- 11年上海赛区赛真题 Bombing
- 11年上海赛区赛真题 Bombing
- POJ 1330 Nearest Common Ancestors(求最近的公共祖先)
- fseek()
- 考试过关必胜笔记法
- 12.1.7 HttpServletRequest和HttpServletResponse
- IIS7.5 配置 PHP 5.3.5