分析:DP的基础题
没经过优化的初始代码
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=105;
int a[maxn][maxn],f[maxn][maxn];
int main()
{
int n,m;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
memset(f,0,sizeof(f));
f[1][1]=a[1][1];
for (int i=2;i<=n;i++)
for (int j=1;j<=i;j++)
f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
int sum=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
sum=max(sum,f[i][j]);
printf("%d",sum);
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=105;
int a[maxn][maxn],f[maxn][maxn];
int main()
{
int n,m;
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
memset(f,0,sizeof(f));
f[1][1]=a[1][1];
for (int i=2;i<=n;i++)
for (int j=1;j<=i;j++)
f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
int sum=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
sum=max(sum,f[i][j]);
printf("%d",sum);
return 0;
}
稍微优化之后的代码
#include <iostream>
#include <algorithm>
const int maxn=101;
using namespace std;
int main()
{
int n, a[maxn][maxn];
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
cin >> a[i][j];
for (int i = n-1; i >= 1 ; i--)
for (int j = 1; j <= i; j++)
a[n][j] = max(a[n][j], a[n][j+1]) + a[i][j];
cout << a[n][1];
}
#include <algorithm>
const int maxn=101;
using namespace std;
int main()
{
int n, a[maxn][maxn];
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
cin >> a[i][j];
for (int i = n-1; i >= 1 ; i--)
for (int j = 1; j <= i; j++)
a[n][j] = max(a[n][j], a[n][j+1]) + a[i][j];
cout << a[n][1];
}