dp题

主要用来记录一些做过dp题目

数字三角形

状态转移方程\(dp[x][y]=max(dp[x+1][y],dp[x+1][y+1])+dp[x][y]\)

#include<iostream>
using namespace std;
const int maxn=1000+10;
int n,a[maxn][maxn],ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++){
            cin>>a[i][j];
            a[i][j]+=max(a[i-1][j-1],a[i-1][j]);
            ans=max(ans,a[i][j]);
        }
    cout<<ans<<endl;
    return 0;
}

洛谷P1434

记忆化搜索

#include<iostream>
using namespace std;
int k;
int m,n;
int dp[10050][105],a[105][105];
int dx[4]={-1,1,0,0},dy[4]={0,0,1,-1};//l r u d
int dfs(int x,int y){
	int& ans=dp[x][y];
	if(ans>0)return ans;
	for(int i=0;i<4;++i){
		int nextx=x+dx[i],nexty=y+dy[i];
		if(nextx>=0&&nextx<m&&nexty>=0&&nexty<n)
			if(a[nextx][nexty]<a[x][y])
				ans=max(ans,dfs(nextx,nexty));
	}
	ans++;
	dp[x][y]=ans;
	return ans;
}
int main(){
	cin>>m>>n;
	for(int i=0;i<m;++i)
		for(int j=0;j<n;++j)
			cin>>a[i][j];
	int ans=0;
	for(int i=0;i<m;++i)
		for(int j=0;j<n;++j)
			ans=max(ans,dfs(i,j));
	cout<<ans;
	return 0;
}
上一篇:22, k8s 之Kubernetes控制器种类


下一篇:快速幂&矩阵快速幂