P1216-DP【橙】

发布时间 2023-11-02 09:20:34作者: Kai-G

在这道题中,我第一次用了memset,确实方便,不过需要注意的是只有全部赋值-1和0的时候才能使用它,否则他能干出吓死人的事。以及memset在cstring头文件里,在本地就算不include也能照常编译,但评测机里可能不行,所以一定要写上cstring
同时,我半获得半自我总结了一个暴论,这个暴论直接让我理解DP到底是个啥了。
暴论如下:
暴论,除了存参数返回值对应关系的的DP数组外不准更改外部变量(不准更改意味着可以把变量当常量引用)的dfs就是动态规划!反之亦然!换句话说,记忆化搜索是一种特殊的dfs,不只是加了记忆化,还要求改dfs不能修改在dfs外部定义的全局变量,因为只有这样的dfs才能记忆化。而这种记忆化搜索其实就是DP,完全等价!!!至于递推形式的DP才是引申出来的DP新写法,想学习DP完全可以从学习新形式的dfs来入手逐渐掌握DP是想干啥。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
int N;
int DP[1005][1005],a[1005][1005];
//暴论,除了存参数返回值对应关系的的DP数组外不准更改外部变量(不准更改意味着可以把变量当常量引用)的dfs就是动态规划!倘若真的如此哪便能彻底明白动态规划了!!!
int dfs(int x,int y)
{
	if(DP[x][y]!=-1)return DP[x][y];
	if(x==N)return DP[x][y]=a[x][y];
	else
	{
		return DP[x][y]=a[x][y]+max(dfs(x+1,y),dfs(x+1,y+1));
	}
}

int main()
{
	cin>>N;
	memset(DP,-1,sizeof(DP));
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=i;j++)
		{
			cin>>a[i][j];
		}
	}
	cout<<dfs(1,1)<<endl;
    return 0;
}