算法-动态规划

来源:互联网 发布:出色的有声小说 知乎 编辑:程序博客网 时间:2024/06/18 05:27

      递归方程+边界条件


例子:⑴数字三角

#include <iostream>int n;int a[100][100];//存三角的值int b[100][100];//存路径最大值using namespace std;int max(int i,int j){    if(i>=j){        return i;    }    else{        return j;    }}int main(){    cin>>n;    for(int i=1;i<=n;i++)//这道题i和j从1开始    {        for(int j=1;j<=i;j++)        {            cin>>a[i][j];        }    }    for(int j=1;j<=n;j++){        b[n][j]=a[n][j];    }/*   下面这个循环就是这个算法的精粹   因为暂时的小不一定就整条路径小,所以需要枚举各条路径,而这样做无疑是最适合的*/    for(int i=n-1;i>0;i--){        for(int j=1;j<=i;j++){            b[i][j] = a[i][j]+max(b[i+1][j],b[i+1][j+1]);        }    }    //c[1]=a[1][1];    cout<<b[1][1];    cout<<endl;/*   这里找出靠右路径是第二个难点*/    cout<<a[1][1]<<" ";    int y=1;//    for(int i=1;i<=n;i++){//        for(int j=1;j<=i;j++){//            cout<<b[i][j]<<" ";//        }//        cout<<endl;//    }    for(int i=2;i<=n;i++){        if(b[i][y]<=b[i][y+1]){//这里等于一起取,路径就靠右            cout<<a[i][y+1]<<" ";            y++;        }        else{        cout<<a[i][y]<<" ";        }    }    return 0;}/*    5    n    7    数组a   3 8  8 1 0 2 7 4 44 5 2 6 5处理后的b数组:         30       23  21     20  13  10    7  12  10  10   4  5   2   6  5*/

⑵最长公共子串

⑶旅游背包

1 0
原创粉丝点击