在这道题中,我第一次用了memset,确实方便,不过需要注意的是只有全部赋值-1和0的时候才能使用它,否则他能干出吓死人的事。以及memset在cstring头文件里,在本地就算不include
同时,我半获得半自我总结了一个暴论,这个暴论直接让我理解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;
}
标签:暴论,int,dfs,P1216,1005,include,DP
From: https://www.cnblogs.com/gongkai/p/17804661.html