洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
2022/2/14 6:13:49
本文主要是介绍洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目链接:https://www.luogu.com.cn/problem/P1216;
有两种思路:递推和记忆化搜索。
先说递推:
我们采取从底到上的遍历思路,这样相比于从上往下更可节省时间,不至于造成TLE,所以dp【i】【j】就表示第i层第j个数开始往下走的数字和。
具体代码如下:
#include<bits/stdc++.h> using namespace std; int r; int dp[1010][1010];//第i层第j个数字开始向下走的数字和 int a[1010][1010];//第i层第j个数字 int main() { ios::sync_with_stdio(false); cin>>r; for(int i=0;i<r;i++)//杨辉三角的输入形式 for(int j=0;j<=i;j++) cin>>a[i][j]; for(int j=0;j<r;j++) dp[r-1][j]=a[r-1][j];//先计算底部 for(int i=r-2;i>=0;i--)//从倒数第二层向上到第一层 { for(int j=0;j<=i;j++) { dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];//从左边上来或者是从右边上来,取其大 } } cout<<dp[0][0]<<endl; return 0; }
当然,我们可以引入记忆化搜索:
因为在测试样例中我们可以看到第三行第二列的1是被重复递归的,因为从它左上边的3递归计算下来之后,从8下来也被重复递归计算,这样就会造成时间上的浪费,应用了记忆化搜索则会减少这一流程的时间。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int r; 4 int dp[1010][1010];//第i层第j个数字开始向下走的数字和 5 int a[1010][1010];//第i层第j个数字 6 int dfs(int i,int j) 7 { 8 if(i==r-1)//边界条件,到了最底层 9 return a[i][j]; 10 if(dp[i][j]>0)//记忆化标记,初始值是0,如果大于0就不用在重复递归计算了 11 return dp[i][j]; 12 return dp[i][j]=max(dfs(i+1,j),dfs(i+1,j+1))+a[i][j]; 13 } 14 int main() 15 { 16 ios::sync_with_stdio(false); 17 cin>>r; 18 for(int i=0;i<r;i++)//杨辉三角的输入形式 19 for(int j=0;j<=i;j++) 20 cin>>a[i][j]; 21 dfs(0,0);//执行递归一直到最底部然后返回到dp[0][0] 22 cout<<dp[0][0]<<endl; 23 return 0; 24 }
这篇关于洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16useReducer案例详解:从零开始理解与应用
- 2024-11-15聊聊用LangChain4J构建聊天机器人的那些事儿
- 2024-11-15LangChain 和 LlamaIndex 在检索增强生成(RAG)中的大比拼:全面对比评测
- 2024-11-15平台工程不只是配置管理:超越CFEngine的方法
- 2024-11-152023年KubeCon芝加哥大会精华回顾
- 2024-11-15我花了3小时大致了解了ClickHouse
- 2024-11-15在使用平台私钥进行解密时提示 "私钥解密失败" 错误信息是什么原因?-icode9专业技术文章分享
- 2024-11-15Layui框架有哪些方式引入?-icode9专业技术文章分享
- 2024-11-15Layui框架中有哪些减少对全局环境的污染方法?-icode9专业技术文章分享
- 2024-11-15laydate怎么关闭自动的日期格式校验功能?-icode9专业技术文章分享