zoukankan      html  css  js  c++  java
  • hdu2845 dp

    这题开始的思路:用二维数组来存,果断超时了,因为数组开不了。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    #define maxn 10002
    int map[maxn][maxn],dp[maxn][maxn],ans[maxn];
    int main()
    {
        int i,j;
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    scanf("%d",&map[i][j]);
                }
            }
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    dp[i][j]=max(dp[i][j-1],dp[i][j-2]+map[i][j]);
                }
            }
            /*for(i=1;i<=n;i++)
                printf("%d ",dp[i][m]);
            puts("");*/
            for(i=1;i<=n;i++)
                ans[i]=0;
            for(i=1;i<=n;i++)
            {
                if(i==1)
                {
                    ans[i]=max(ans[i],dp[i][m]);
                }
                else
                {
                    ans[i]=max(ans[i-1],ans[i-2]+dp[i][m]);
                }
            }
            printf("%d
    ",ans[n]);
        }
    }

    后来看了别人的题解,使用一维数组来存。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    #define maxn 200010
    int dp[maxn],ans[maxn],map[maxn];
    int max(int x,int y)
    {
        return x>y?x:y;
    }
    int main()
    {
        int i,j;
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    scanf("%d",&dp[j]);
                }
                for(j=1;j<=m;j++)
                {
                    dp[j]=max(dp[j-1],dp[j-2]+dp[j]);
                }
                ans[i]=dp[m];
            }
            /*for(i=1;i<=n;i++)
                printf("%d ",dp[i][m]);
            puts("");*/
            for(i=2;i<=n;i++)
            {
                ans[i]=max(ans[i-2]+ans[i],ans[i-1]);
            }
            printf("%d
    ",ans[n]);
        }
    }
  • 相关阅读:
    第一天 学习绪论
    我的java学习道路
    windows2003 iis+dedecms 4.0701版本,登录后台显示空白
    iis+php+mysql
    net 连mysql奇怪问题
    Windows 2008安装SQL 2008图解
    注册码
    [VS2013]如何闪开安装VS2013必须要有安装IE10的限制
    net SqlBulkCopy拷贝数据的问题
    Android应用与系统安全防御
  • 原文地址:https://www.cnblogs.com/sweat123/p/4762303.html
Copyright © 2011-2022 走看看