动态规划:数塔问题 hdu 2084 dp

来源:互联网 发布:tensorflow 用什么语言 编辑:程序博客网 时间:2024/06/05 17:46
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
带备忘录的自顶向下:
#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];}elsereturn 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:busing 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]);}}

注意处理边界问题





0 0