标题: | 1.5-1数字金字塔 | 详情: | 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 |
http://bbs.codeaha.com/problem-12146.html 这题我一样用三种方式:普通dfs,记忆化dfs,和动态规划 1.普通dfs: - #include <cstdio>
- #include <algorithm>
- using namespace std;
- int a[1001][1001]={0},n,cnt;
- int dfs(int x,int y)
- {
- if (x==n)//边界值
- {
- return a[x][y];返回
- }
- return max(dfs(x+1,y),dfs(x+1,y+1))+a[x][y];//上面+右上角
- }
- int main()
- {
- int i,j;
- scanf("%d",&n);
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=i;j++)
- {
- scanf("%d",&a[i][j]);
- }
- }
- printf("%d",dfs(1,1));
- return 0;
- }
复制代码
2.记忆化dfs - #include <cstdio>
- #include <algorithm>
- using namespace std;
- int a[1001][1001]={0},n,cnt,f[1001][1001]={0};
- int dfs(int x,int y)
- {
- if(f[x][y]==-1)
- {
- f[x][y]=max(dfs(x+1,y),dfs(x+1,y+1))+a[x][y];//记忆化
- }
- return f[x][y];返回值
- }
- int main()
- {
-
- int i,j;
-
- scanf("%d",&n);
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=i;j++)
- {
- scanf("%d",&a[i][j]);//读入
- f[i][j]=-1;
- }
- }
-
- for(i=1;i<=n;i++)
- f[n][i]=a[n][i];
-
- printf("%d",dfs(1,1));
- return 0;
- }
复制代码
3.动态规划: - #include <cstdio>
- int main()
- {
- int n,a[1001][1001],d[1001][1001],i,j,k;
- scanf("%d",&n);
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=i;j++)
- {
- scanf("%d",&d[i][j]);
- }
- }
- for(j=1;j<=n;j++)
- {
- a[n][j]=d[n][j];
- }
- for(i=n-1;i>=1;i--)
- {
- for(j=1;j<=i;j++)
- {
- if(a[i+1][j+1]>a[i+1][j]) //分类
- {
- a[i][j]=d[i][j]+a[i+1][j+1];选择右上角
- }
- else
- {
- a[i][j]=d[i][j]+a[i+1][j];选择上面
- }
- }
- }
- printf("%d",a[1][1]);
- return 0;
- }
复制代码
|