动态规划问题
重新梳理了一遍关于最优子结构和无后效性的理解。递推,贪心和动态规划的异同点,有空独立成篇吧。
学习果真是如邵成所讲,先学会后理解。
算法分析:
自底向上,从倒数第二行起,用DP[I][J]取当前节点所能选择的最大值,(最优子结构,打表上推。
时间复杂度为O(n^2);
代码如下:
#include <iostream>
#include<memory.h>
using namespace std;
int main()
{
int n;cin>>n;
int dp[101][101];
memset(dp,0,101);
for(int i=1;i<n+1;i++)//输入
{
for(int j=1;j<=i;j++)
{
cin>>dp[i][j];
}
}
for(int i=n-1;i>=0;i--)//处理
{
for(int j=0;j<=i;j++)
{
dp[i][j]+=(dp[i+1][j]>dp[i+1][j+1])?dp[i+1][j]:dp[i+1][j+1];//从左下和右下两个节点选择最优
}
}
cout<<dp[1][1]<<endl;//输出
return 0;
}
AC,288K 32MS
可以用一维数组做,下次整理出来看看菊苣们的解法