递归方程+边界条件
例子:⑴数字三角
#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 4
4 5 2 6 5
处理后的b数组:
30
23 21
20 13 10
7 12 10 10
4 5 2 6 5
*/
⑵最长公共子串
⑶旅游背包