51nod 1002 数塔取数问题

来源:互联网 发布:宿迁装修公司知乎 编辑:程序博客网 时间:2024/04/29 13:18

51nod 1002 数塔取数问题

取左上,和上方大的,加上此数即可。

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <queue>#include <map>using namespace std;#define LL long long#define INF 0x3f3f3f3f#define PI acos(-1.0)#define E 2.71828#define MOD 1000000007#define N 510#define M 5010int p[N][N];int dp[N][N];int main(){    int n;    scanf("%d",&n);    for(int i = 1; i <= n; i++)        for(int j = 1; j <= i; j++)            scanf("%d",&p[i][j]);    dp[1][1] = p[1][1];    for(int i = 2; i <= n; i++)    {        for(int j = 1; j <= i; j++)        {            if(j == 1)                dp[i][j] = dp[i-1][j]+p[i][j];            else if(j == i)                dp[i][j] = dp[i-1][j-1]+p[i][j];            else                dp[i][j] = max(dp[i-1][j],dp[i-1][j-1])+p[i][j];            //printf("%5d",dp[i][j]);        }    }    int maxn = 0;    for(int i = 1; i <= n; i++)        if(dp[n][i] > maxn)            maxn = dp[n][i];    printf("%d\n",maxn);}过一发后,优化下空间!虽然貌似并没啥软用,图空间还是V^2。。。int p[N][N];int dp[N];int main(){    int n;    scanf("%d",&n);    for(int i = 1; i <= n; i++)        for(int j = 1; j <= i; j++)            scanf("%d",&p[i][j]);    dp[1] = p[1][1];    for(int i = 2; i <= n; i++)    {        for(int j = 1; j <= i; j++)        {            int next;            if(j == 1)            {                next = dp[j];                dp[j] = dp[j]+p[i][j];            }            else if(j == i)                dp[j] = next+p[i][j];            else            {                int temp = dp[j];                dp[j] = max(dp[j],next)+p[i][j];                next = temp;            }            //printf("%5d",dp[j]);        }        puts("");    }    int maxn = 0;    for(int i = 1; i <= n; i++)        if(dp[i] > maxn)            maxn = dp[i];    printf("%d\n",maxn);}
0 0