CSP动态规划专训题解

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

虽然是赛时发的,但仍然是赛后题解

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[ja1[i]][ja2[i]]+v[i]}

其中第一层循环为 i i i ,第二层循环为 j j j ,第三层循环为 k k

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值