poj——3176
2015-06-18 13:03
232 查看
#include <iostream> #include<cstdio> #include<cstdlib> //#include<memory.h> #include<string.h> #include<algorithm> using namespace std; int s[360][360]; int dfs(int x,int y,int n) { //cout<<endl<<x<<"->"<<y<<endl; int res=0; if(x==n) { return 0; } else { res= max(dfs(x+1,y,n)+s[x][y],dfs(x+1,y+1,n)+s[x][y]); } return res; } int main() { int n,i,j,result; scanf("%d",&n); memset(s,-1,sizeof(s)); for(i=0;i<n;i++) { for(j=0;j<=i;j++) cin>>s[i][j]; } result=dfs(0,0,n); cout<<result<<endl; }
此题直接用深搜会超时, 贴上代码
但是用“记忆化搜索则会解决这个问题”;继续贴上ac代码
#include <iostream>
#include<cstdio>
#include<cstdlib>
//#include<memory.h>
#include<string.h>
#include<algorithm>
using namespace std;
int s[360][360];
int dp[360][360];
int dfs(int x,int y,int n)
{
//cout<<endl<<x<<"->"<<y<<endl;
if(dp[x][y]>=0)
{
return dp[x][y];
}
int res=0;
if(x==n)
{
return 0;
}
else
{
dp[x][y]= max(dfs(x+1,y,n)+s[x][y],dfs(x+1,y+1,n)+s[x][y]);
res=dp[x][y];
}
return res;
}
int main()
{
int n,i,j,result;
//while(scanf("%d",&n)!=EOF){
scanf("%d",&n);
memset(s,-1,sizeof(s));
memset(dp,-1,sizeof(dp));
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
cin>>s[i][j];
}
result=dfs(0,0,n);
cout<<result<<endl;//}
}
相关文章推荐
- shell编程中的小问题
- 直接插入排序与直接选择排序
- 排序--气泡排序
- MySQL批量去掉某一个字段特定的值
- AES加密算法
- “无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539) “解决方案
- A MST Problem
- 在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程。守护进程是在后台运行不与任何控制终端关联,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于
- 【opencv】Mat数据直方图计算函数
- log4cpp 封装
- Game of Diamond
- 【Linux 内核网络协议栈源码剖析】socket.c——BSD Socket层(1)
- hive 创建/删除/截断 表(翻译自Hive wiki)
- 《大道至简》阅读笔记二
- 大道至简阅读笔记之三
- hive数据操作
- 排序--希尔排序
- Android studio使用过程中遇到的问题
- iOS真机UI调试利器——Reveal
- Java基础