主要用来记录一些做过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;
}
01背包
#include<iostream>
using namespace std;
int t,m,w[105],v[105],dp[1050];
int main(){
cin>>t>>m;
for(int i=1;i<=m;i++)
cin>>w[i]>>v[i];
for(int i=1;i<=m;i++)
for(int j=t;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
cout<<dp[t];
return 0;
}
完全背包
#include<iostream>
using namespace std;
long long dp[10000000];
int main(){
int n,t,t1,v;
cin>>t>>n;
for(int i=1;i<=n;++i){
cin>>t1>>v;
for(int j=t1;j<=t;++j)
dp[j]=max(dp[j-t1]+v,dp[j]);
}
cout<<dp[t];
return 0;
}