ACM算法模板---动态规划

数字三角形的最大值

         3
      3    2
  4     5     1
1    3     4     1

把局部贪心转化为全区贪心
递归
1.不使用动态规划

#include 
#include 
using namespace std;
int dp[101][101];
int n;
int maxx(int x, int y) {
	if (x == n) {
		return dp[x][y];//最后一行
	}
	else {
		return max(maxx(x + 1, y), maxx(x + 1, y + 1)) + dp[x][y];//单一情况一个三角形
	}
}
int main()
{
	int num;
	cin >> num;
	while (num--) {
		cin >> n;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= i; j++)
			{
				cin >> dp[i][j];
			}
		}
		cout << maxx(1, 1);
	}
}

2.使用动态规划

#include 
#include 
using namespace std;
int dp[101][101];
int maxsum[101][101];
int n;
int la=1;
int maxx(int x,int y){
    if(x==n){
        maxsum[x][y]=dp[x][y];
    }//最后一行下面无数
    if(maxsum[x][y]!=-1){
        return maxsum[x][y];
    }//记忆化搜索
    else{
        maxsum[x][y]=max(maxx(x+1,y),maxx(x+1,y+1))+dp[x][y];
    }
    cout<<1<<endl;
    
    return maxsum[x][y];//返回最大值
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++) {
            cin >> dp[i][j];
            maxsum[i][j]=-1;
        }
    }
    cout<<maxx(1,1);
}


你可能感兴趣的:(acm算法)