`
lgh1992314
  • 浏览: 315679 次
文章分类
社区版块
存档分类
最新评论

poj_3176Cow Bowling问题(已解决)

 
阅读更多
Cow Bowling
Time Limit:1000MS Memory Limit:65536K
Total Submissions:11089 Accepted:7256

Description

The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard bowling-pin-like triangle like this:

          7



        3   8



      8   1   0



    2   7   4   4



  4   5   2   6   5
Then the other cows traverse the triangle starting from its tip and moving "down" to one of the two diagonally adjacent cows until the "bottom" row is reached. The cow's score is the sum of the numbers of the cows visited along the way. The cow with the highest score wins that frame.

Given a triangle with N (1 <= N <= 350) rows, determine the highest possible sum achievable.

Input

Line 1: A single integer, N

Lines 2..N+1: Line i+1 contains i space-separated integers that represent row i of the triangle.

Output

Line 1: The largest sum achievable using the traversal rules

Sample Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Sample Output

30

Hint

Explanation of the sample:

          7

         *

        3   8

       *

      8   1   0

       *

    2   7   4   4

       *

  4   5   2   6   5
The highest score is achievable by traversing the cows as shown above.
数塔问题!!!
和1163一样,测试了N久随机数据,可是就是wa,希望有人解答。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <algorithm>
using namespace std;

int maps[355][355];
int Hash[355][355];
int n;

void DFS(int x, int y)
{
	if(x == n) return;
	for(int i=0;i<=1;i++)
	{
		int p = x + 1;
		int q = y + i;
		if(p>=q && maps[p][q] + Hash[x][y] > Hash[p][q])
		{
			Hash[p][q] = maps[p][q] + Hash[x][y];
			DFS(p,q);
		}
	}
}

int main()
{
	freopen("in.txt","r",stdin);
	scanf("%d",&n);
	memset(maps,0,sizeof(maps));
	memset(Hash,0,sizeof(Hash));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			scanf("%d",&maps[i][j]);
		}
	}
	Hash[1][1] = maps[1][1];
	DFS(1,1);
	int sum = maps[1][1];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			sum = max(sum,Hash[i][j]);
			//printf("hash[%d][%d] = %d\n",i,j,Hash[i][j]);
		}
	}
	printf("%d\n",sum);
	printf("Time used = %.2lf\n",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}

测试数据:
http://contest.usaco.org/DEC05_4.htm
一组铁定超时,我们不再考虑,引起错误的是150行0的那组测试数据,里面有个1.
Hash 数组memset初始化有问题,初始化为-1则所有结果正确。。。
此题的解决方法已经写出,不外乎记忆化搜索,DP。。。。



另附菜菜的随机测试代码:
#include <iostream>
#include <ctime>
#include <cstdio>
#include <windows.h>
using namespace std;
int main()
{
	while(1)
	{
		FILE *fp;
		fp = fopen("E:\\ACM\\POJ\\poj_3176\\in.txt","w");
		int n;
		srand(time(NULL));
		n = rand()%100;
		fprintf(fp,"%d\n",n);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=i;j++)
			{
				fprintf(fp,"%d ",rand() % 100);
			}
			fprintf(fp,"\n");
		}
		fclose(fp);
		Sleep(5000);
		system("type in.txt");
		system("type.bat");
	}
	
    return 0;
}
 

type.bat
:
@type in.txt|1.exe
@1.exe<in.txt>>out1.txt
@type in.txt|2.exe
@2.exe<in.txt>>out2.txt
递归版本:
#include <iostream>
#include <cstring>
using namespace std;

int maps[355][355];
int vis[355][355];
int n;

int DFS(int x, int y)
{
	return vis[x][y] = maps[x][y] + ( x==n ? 0 : DFS(x+1,y) > DFS(x+1,y+1) ? DFS(x+1,y):DFS(x+1,y+1));
}

int main()
{
	freopen("in.txt","r",stdin);
	int i,j;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i;j++)
		{
			cin>>maps[i][j];
		}
	}
	cout<<DFS(1,1)<<endl;
}



初学动态规划:
自下而上,
#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int maps[355][355];
int vis[355][355];

int main()
{
	freopen("in.txt","r",stdin);
	int i, j;
	cin >> n;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i;j++)
		{
			cin >> maps[i][j];
		}
	}

	for(j=1;j<=n;j++)
		vis[n][j] = maps[n][j];
	for(i=n;i>=1;i--)
	{
		for(j=1;j<=i;j++)
		{
			vis[i][j] = maps[i][j] + max(vis[i+1][j],vis[i+1][j+1]);
		}
	}
	cout<<vis[1][1]<<endl;


}

记忆化搜索:
#include <iostream>
#include<cstring>
using namespace std;

int maps[355][355];
int vis[355][355];
int n;

int DFS(int x, int y)
{
	if(vis[x][y]>=0) return vis[x][y];
	return vis[x][y] = maps[x][y] + (x == n ? 0 : DFS(x+1,y) > DFS(x+1,y+1) ? DFS(x+1,y) : DFS(x+1,y+1));
}

int main()
{
	freopen("in.txt","r",stdin);
	int i,j;
	memset(vis,-1,sizeof(vis));
	cin>>n;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i;j++)
		{
			cin>>maps[i][j];
		}
	}
	cout<<DFS(1,1)<<endl;
	return 0;
}


分享到:
评论

相关推荐

    北大POJ3176-Cow Bowling

    北大POJ3176-Cow Bowling

    POJ3176-Cow Bowling

    "POJ3176-Cow Bowling.doc"可能是对解题思路和代码的详细解释文档,包括问题分析、算法设计、代码实现步骤以及测试用例等。这类文档对于理解解题过程和学习算法有着重要的参考价值,有助于提高编程思维和解决问题的...

    poj_1699.rar_1699_poj_poj1699

    【标题】"poj_1699.rar_1699_poj_poj1699" ...同时,这也是一个很好的实例,展示了在面对实际问题时,如何运用计算机科学的理论知识来解决问题。对于想要参加类似编程竞赛或提升编程技能的人来说,这样的资源是宝贵的。

    poj2775.rar_poj_poj 27_poj27_poj2775

    标题中的"poj2775.rar"是一个与编程竞赛相关的压缩文件,通常在这样的竞赛中,参赛者需要解决特定的编程问题。"poj"是"Programming Online Judge"的缩写,它是一个在线编程练习平台,允许用户提交代码并进行自动测试...

    poj_2682(3).rar_C++ 数组扩充_poj 26_poj 2682_poj26

    标题中的"poj_2682(3).rar"是一个指向编程竞赛问题的引用,通常这类问题在网站如POJ(Programming Online Judge)上出现,供程序员解决并提交代码进行测试。这个问题的编号是2682,可能涉及到特定的数据结构或算法...

    pku_poj_2187.rar_poj 2187_凸包问题

    描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个问题的算法时间复杂度应为O(nlogn),意味着我们需要一种高效的方法来处理包含n个点的凸包构建。 在计算机科学中,凸包问题是一个经典几何问题,特别是在算法...

    Poj_1102_.rar_poj11

    通常,这类文档会详细解释如何理解和解决问题,包括输入格式、输出格式、边界条件以及可能的优化策略。 在实际学习和解题中,这类资源是非常宝贵的,因为它不仅提供了问题的解决方案,还可能包括错误陷阱、时间/...

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    poj_3310.rar_3310_poj

    【标题】"poj_3310.rar_3310_poj"是一个与编程竞赛相关的压缩包,其中包含了对POJ(Problem Online Judge)3310问题的解决方案和详细解析。POJ是一个著名的在线编程竞赛平台,提供各种算法题目供参赛者练习和提交...

    poj_3613解题报告

    2遍dp poj_3613解题报告 poj_3613解题报告

    ACM.zip_ACM_poj_poj3187_poj3669

    在ACM竞赛中,快速解决问题的能力至关重要,因此,参赛者通常会采用高效算法和优化技巧。C++是一种常用的编程语言,因其性能优秀、对底层控制强而被广泛用于算法竞赛。解题过程中,可能会使用STL(Standard Template...

    1010_stamps.zip_1010_POJ 1010_poj_poj stamps_poj10

    POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的算法应用和陷阱设置,是提升编程技巧的良好...

    POJ3277.rar_3277 poj_poj3277_多个面积_线段树

    POJ是一个著名的在线编程竞赛平台,参与者需要解决各种算法问题并提交代码进行测试。这个问题的关键在于计算平面上多个矩形的总面积,而解冑方案是使用线段树这一数据结构。 线段树是一种高效的数据结构,适用于...

    poj_1002_487.rar_poj 1002

    通过阅读和分析这个文件,我们可以学习到具体的实现细节,例如如何读取输入,如何处理字符串,以及如何使用哈希映射来解决问题。 总的来说,这道POJ 1002题目的解决需要掌握基本的C++编程技能,了解字符串处理,...

    poj1990.rar_POJ 19_poj_poj19

    对于POJ 1990题目,我们需要解决的问题可能涉及到对某一区间进行快速求和或者更新操作,而树状数组正好可以满足这种需求。 题目描述虽然简短,但隐藏了对数据结构和算法的深度理解要求。"2个树状数组"的提示意味着...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    学习这些内容可以帮助提升对几何算法的理解,锻炼编程解决问题的能力。对于POJ 3714,考生可能需要特别关注题目描述,理解几何模型,然后设计合适的算法来处理所有可能的输入情况。在Visual C++环境中编写和调试代码...

    POJ_keptsl6_C++_

    动态规划(Dynamic Programming, DP)是一种在计算机科学中解决问题的方法,它通过将复杂问题分解为子问题来求解,通常用于优化问题和计算问题。深度优先搜索(Deep First Search, DFS)和广度优先搜索(Breadth First ...

    C_(POJ_1854)(分治).cpp

    C_(POJ_1854)(分治).cpp

    D_(POJ_1723)(思维)(sort).cpp

    D_(POJ_1723)(思维)(sort).cpp

    POJ.rar_poj java_poj1048

    3. 动态规划或递归思维:构建解决问题的状态转移方程。 4. 问题分析能力:理解加强版的规则并转化为编程模型。 5. 优化技巧:对于大规模数据,如何减少计算量,提高运行效率。 在实际编程中,我们需要编写测试用例...

Global site tag (gtag.js) - Google Analytics