動態規劃:數塔問題 hdu 2084 dp
阿新 • • 發佈:2019-02-06
帶備忘錄的自頂向下:
遞推:
注意處理邊界問題
#include<iostream> #include<cstring> using namespace std; int tower[101][101]; int d[101][101]; int solve(int i,int j,int n)//帶備忘錄自頂向下 { if(d[i][j])return d[i][j]; int v1,v2; v1=v2=0; if(i<n&&j<n) { v1=tower[i][j]+solve(i+1,j,n); v2=tower[i][j]+solve(i+1,j+1,n); d[i][j] = v1>v2?v1:v2; return d[i][j]; } else return 0; } int main() { int c,n; cin>>c; while(c--) { cin>>n; memset(d,0,sizeof(d)); for(int i=0;i<n;i++) for(int j=0;j<=i;j++) { cin>>tower[i][j]; } int ans = solve(0,0,n); cout<<ans<<endl; } }
遞推:
#include<cstdio> #include<cstring> #define Max(a,b) a>b?a:b using namespace std; const int N = 102; int m[N][N],dp[N][N]; int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&m[i][j]); memset(dp,0,sizeof(dp)); //for(int j=1;j<=n;j++)dp[n][j]=m[n][j]; for(int i=n;i>=1;i--) { for(int j=1;j<=i;j++) { dp[i][j] = Max(dp[i+1][j]+m[i][j],dp[i+1][j+1]+m[i][j]); } } printf("%d\n",dp[1][1]); } }
注意處理邊界問題