動態規劃初步--數字三角形

數字三角形是一個由非負數組成的三角形,第n行有n個數,形如:數組

1 bash

2 3markdown

4 5 6函數

除最下行以外,每一行的左下和右下各有一個數,從第一行開始,向下,左或者右走一格,直到走到最後一行,所通過的路徑上的數的和最大spa

除了簡單的遞歸運算:code

int d(int i,int j){    
    return a[i][j]+(i==n?0:d(i+1,j)>?d(i+1,j+1));
}複製代碼

以及遞推運算:
orm

int i,j;
for(j=1;j<=n;j++)
    d[n][j]=a[n][j];
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++){  
    d[i][j]=a[i][j]+d[i+1][j]>?d[i+1][j+1];     
}複製代碼

還能夠用記憶化搜索的方法,減小計算量,記憶化搜索的方法定義一個數組d,d初始化值所有爲-1,而後再編寫遞歸函數,若是發現d[i][j]的值已經被計算過了,就直接返回:
遞歸

#include "stdio.h"
#include "memory.h"
int d[100][100];
int a[100][100];
int n;
int b(int i,int j){
    if (d[i][j]>=0) return d[i][j];
    if (i!=n)
    {
        int temp=b(i+1,j)>b(i+1,j+1)?b(i+1,j):b(i+1,j+1);
        d[i][j]=a[i][j]+temp;
    }
    else{
        d[i][j]=a[i][j];
    }
    return d[i][j];
}
void main(){
    memset(a,0,100*100*sizeof(int));
    memset(d,-1,100*100*sizeof(int));
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        for (int j=0;j<=i;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    int t=b(0,0);
}複製代碼
相關文章
相關標籤/搜索