比赛请见这里。
(虽然是赛时发的,但仍然是赛后题解)
P1216 数字三角形 Number Triangles
这道题是一道最基础不过的迪屁了。如果你使用超级无敌大爆搜的话,那你这道题肯定会 T T T 掉。我们需要把每个数加上它左下角和右下角中最大的数,从倒数第二行开始,一层一层往前递推,答案就出来了。
状态转移方程:
d p [ i ] [ j ] + = m a x { d p [ i + 1 ] [ j ] , d p [ i + 1 ] [ j + 1 ] } dp[i][j]+=max\{dp[i+1][j],dp[i+1][j+1]\} dp[i][j]+=max{ dp[i+1][j],dp[i+1][j+1]}
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main(int argc,char *argv[])
{
int n;
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[i][j] += max(a[i+1][j],a[i+1][j+1]);
}
}
cout << a[1][1];
return 0;
}
(懂的都懂,不懂建议去百度一下)
P1507 NASA的食物计划
这是一道非常经典的01背包型动态规划,就是每个东西只能选一次,求最大值,请点这里。我们首先需要开一个 d p dp dp 二维数组,下标为体积和质量。这时候有些人就要问了:你的博客里面的动态规划那题不是一维数组吗?这里怎么变成二维的了?
这是因为那里只有一个限制条件,但这里有两个限制条件,所以要开二维,当循环完后, d p [ n ] [ m ] dp[n][m] dp[n][m] 就是最优解。
状态转移方程:
d p [ j ] [ k ] = m a x { d p [ j ] [ k ] , d p [ j − a 1 [ i ] ] [ j − a 2 [ i ] ] + v [ i ] } dp[j][k]=max\{dp[j][k],dp[j-a1[i]][j-a2[i]]+v[i]\} dp[j][k]=max{ dp[j][k],dp[j−a1[i]][j−a2[i]]+v[i]}
其中第一层循环为 i i i ,第二层循环为 j j j ,第三层循环为 k k

本文介绍了多个涉及动态规划的编程竞赛题目,包括数字三角形、NASA的食物计划、开心的金明、租用游艇、采药、守望者的逃离、摆花、传球游戏和删数等。通过详细的状态转移方程,阐述了解题思路和动态规划的应用,适合提升算法理解与编程技巧。
最低0.47元/天 解锁文章
1540

被折叠的 条评论
为什么被折叠?



