poj 1163解题报告(动态规划)

原创 2012年03月29日 12:08:20
//要求输入一个组阶梯数,求从顶层到最底层的最大和,每个连接只能为该层数字到下层左下数字或右下数字的路径。
  	  7
	3   8
      8   1   0
    2   7   4   4
  4   5   2   6   5
//最大和路径为 7,3,8,7,5之和为30
//思路:maxsum[i,j]为第i行,第j个数的最大和,tr[i,j]为第i行第j个数
//maxsum[i,j]=max(maxsum[i-1,j-1]+tr[i-1,j-1],maxsum[i-1,j]+tr[i-1,j])
//最后的结果就为第N行的所有最大和中最大的一个。
#include <iostream>
using namespace std;
short tr[5051],maxsum[5051];
int main()
{
	int N;
	cin>>N;
	for(int i=1;i<=N*(N+1)/2;++i)
	{
		cin>>tr[i];
	}
	/*for(int i=1;i<=N*(N+1)/2;++i)
	{
	cout<<tr[i]<<" ";
	}*/
	maxsum[0]=0;
	tr[0]=0;
	maxsum[1]=tr[1];
	if (N==1)
	{
		cout<<maxsum[1];
		return 0;
	}

	for (int i=2;i<=N;++i)
	{
		for (int j=1;j<=i;++j)
		{
			if (j==1)
			{
				maxsum[i*(i-1)/2+j]=maxsum[i*(i-1)/2-(i-2)]+tr[i*(i-1)/2+j];   //当为每行第一个数时,只能有上一行的第一个数得到
			}
			else if(j==i)
			{
				maxsum[i*(i-1)/2+j]=maxsum[i*(i-1)/2]+tr[i*(i-1)/2+j];   //每行最后一个数也只能由上一行的最后一个数得到
			}
			else
			{
				if(maxsum[(i-2)*(i-1)/2+j-1]>maxsum[(i-2)*(i-1)/2+j])
				{
					maxsum[i*(i-1)/2+j]=maxsum[(i-2)*(i-1)/2+j-1]+tr[i*(i-1)/2+j];
				}
				else
				{
					maxsum[i*(i-1)/2+j]=maxsum[(i-2)*(i-1)/2+j]+tr[i*(i-1)/2+j];
				}
			}
			
		}
	}
	/*for (int i=1;i<=N;++i)
	{
		for (int j=1;j<=i;++j)
		{
			cout<<maxsum[i*(i-1)/2+j]<<" ";
		}
		cout<<endl;
	}*/
	int max_sum=0;
	for (int j=1;j<=N;++j)
	{
		if (maxsum[N*(N-1)/2+j]>max_sum)
		{
			max_sum=maxsum[N*(N-1)/2+j];

		}
	}
	cout<<max_sum;
	return 0;
}


hdu 动态规划46题

1.Robberies  连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做背包(放大100000倍...
  • youngyangyang04
  • youngyangyang04
  • 2014年08月18日 00:01
  • 847

POJ 1789 解题报告

这道题是求最小生成树。很久之前是用kruskal算法求的(之前已经用过这个模板很多次),但是超时了,这里是稠密图,对所有边排序是非常耗时的操作。这里改用没有优化的prim算法(用的是数组而不是heap...
  • thestoryofsnow
  • thestoryofsnow
  • 2015年08月19日 01:39
  • 275

POJ 1193 内存分配

数据结构: 内存用双向链表模拟,便于内存块的拆分和合并; 进程表用小根堆表示,以进程的结束时间为排序依据; 等待队列就是用先进先出的队列结构了。 算法描述: 设任一时刻当前需要被处理的进程为p1,进程...
  • wyb19910821
  • wyb19910821
  • 2013年11月24日 17:33
  • 570

POJ 2253 解题报告

看了discuss,这道题似乎用很多方法都能accept:多源最短路径(Floyd),单源最短路径(Dijkstra, SPFA),或最小生成树(prime)。 我这里用的是spfa,稍稍改变下条件...
  • thestoryofsnow
  • thestoryofsnow
  • 2015年05月12日 07:54
  • 204

poj3259解题报告

题目等价于判断图里面是否存在一个负环.首先可以采用bellman_ford算法,但是该算法需要一个起始点,而这里是需要判断整个图是否存在负环.因此可以假设有一个源点,假设它与其他所有点连通,并且花费都...
  • pp634077956
  • pp634077956
  • 2015年10月09日 15:23
  • 126

HUD1051 解题报告

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To...
  • liu_jiangwen
  • liu_jiangwen
  • 2017年07月24日 20:31
  • 131

POJ 3259 解题报告

这道题是检查一个有向图中是否存在着一个负环,标准算法是Bellman-Ford algorithm: http://en.wikipedia.org/wiki/Bellman%E2%80%93Ford...
  • thestoryofsnow
  • thestoryofsnow
  • 2014年12月11日 09:30
  • 267

【poj1185】 炮兵阵地 题解&代码(C++)

poj dp 状态压缩
  • DERITt
  • DERITt
  • 2016年04月19日 16:08
  • 11060

POJ 动态规划题目列表及顺切指南

- 一、POJ DP题目顺切指南 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208...
  • u011757339
  • u011757339
  • 2016年07月05日 15:11
  • 597

poj - 1185 炮兵阵地 状压DP 解题报告

炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21553   Accepted...
  • Luwhere
  • Luwhere
  • 2015年07月30日 11:27
  • 533
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1163解题报告(动态规划)
举报原因:
原因补充:

(最多只允许输入30个字)