• 动态规划学习记录 三、数塔问题


    递归分析:d[i][j]=max{d[i+1][j]+v[i+1][j],d[[i+1][j+1]+v[i+1][j+]}//这里已经不是单线程的问题了,所以要用二维坐标表示。所以上从上层节点反回溯到下层节点。

    递推分析:自下而上。

    初始化:最底层的节点信息

    最优子结构:树的每一个节点都是d[i][j]当前最大路径

    代码:

    #include<iostream>
    #include<string.h>
    #define maxn 1000+5
    using namespace std;
    int map[maxn][maxn];
    int dp[maxn][maxn];
    int main(){
    	int n;//这是一个n*n的数塔
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=i;j++){
    			cin>>map[i][j];
    		}
    	}
    	for(int i=1;i<=n;i++)d[n][i]=map[n][i];//初始化哦
    	for(int i=n-1;i>=1;i++){
    		for(int j=1;j<=i;j++){
    			dp[i][j]=max(dp[i+1][j]+map[i][j],dp[i+1][j+1]+map[i][j]);
    			//这里区别于一般的多通道(选择)的原因是下层只有两个节点,不然,就有三重循环了            
    		}
    	}
    	cout<<d[1][1];
    	return 0;
    }
    
  • 相关阅读:
    PHP入门
    bootstrap框架
    jsp5 include forward param
    jsp4 Cookie
    网页定位导航
    jsp3 javabean
    Obsidian md安装闪退
    Excel 2016 Mac VBA 的变化 窗体消失
    Excel Mac 2016 调用 Applescript
    如何自学R
  • 原文地址:https://www.cnblogs.com/little-w/p/3224889.html
Copyright © 2020-2023  润新知