[动态规划]洛谷--P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles

题目链接

题目地址

C++ version

#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int a[N][N],n,dp[N][N],ans;
int main(){
    
    
	cin>>n;
	for(int i = 1;i <= n;i++){
    
    
		for(int j = 1;j <= i;j++){
    
    
			cin>>a[i][j];
			dp[i][j] = a[i][j];
			if(j-1 >= 1)dp[i][j] = max(dp[i][j],a[i][j]+dp[i-1][j-1]);
			if(j <= i-1)dp[i][j] = max(dp[i][j],a[i][j]+dp[i-1][j]);
		}
	}
	for(int i = 1;i <= n;i++)
		ans = max(ans,dp[n][i]);
	cout<<ans;
	return 0;
}

Python version

N = 1005
a = []
dp = []
n = int(input())
for i in range(0,n):
    l1 = list(map(int,input().split()))
    l2 = l1.copy()
    a.append(l1)
    dp.append(l2)

    for j in range(0,i+1):
        if j-1 >= 0:
            dp[i][j] = max(dp[i][j],dp[i-1][j-1] + a[i][j])
        if j <= i-1:
            dp[i][j] = max(dp[i][j],dp[i-1][j] + a[i][j])
ans = 0
for i in range(0,n):
    ans = max(ans,dp[n-1][i])
print(ans)

这里python有一个比较坑的点,当我将l1直接append to dp array 时将会导致对l1的原地改动,简单来说就是更新dp数组的同时会更新a数组,故dp.append(l1.copy())是有必要的

猜你喜欢

转载自blog.csdn.net/qq_20252251/article/details/107165871