hdu1176免费馅饼--简单DP,类似于数塔问题--Java和cpp实现

此题目必须开二维数组以暂存不同时间的数据

从上到下(时间大到小)比较简单,最后输出dp[0][5]的值就可以了。即使dp[0][1-4,6-10]某的数据比dp[0][5]大也不用管。因为开始时(0秒)人站在dp[0][5]的地方,dp[0][5]的结果是有大到小至的dp[1][4],dp[1][5],dp[1][6]的最大值。其余同理。


Java实现代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main
{
    public static int max(int a, int b)
    {
        return a>b? a : b;
    }

    public static int max(int a, int b, int c)
    {
        int mid = b;
        if(a>mid) mid = a;
        if(c>mid) mid = c;
        return mid;
    }

    public static void main(String[] args) throws IOException
    {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        int[][] data = new int[100010][12];
        int mid;
        while(true)
        {
            mid = Integer.parseInt(stdin.readLine());
            if(mid==0) return;
            for(int i=0; i<100010; ++i)//二维数组初始化
                for(int j=0; j<12; ++j)
                    data[i][j] = 0;
            int maxTime = 0;
            for(int t=0; t<mid; ++t)
            {
                String[] temp = stdin.readLine().split(" ");
                int a = Integer.parseInt(temp[0]);
                int b = Integer.parseInt(temp[1]);
                data[b][a]++;
                if(b>maxTime) maxTime = b;
            }
            for(int i=maxTime-1; i>=0; --i)
            {
                for(int j=0; j<=10; ++j)
                {
                    if(j==0) data[i][j] += max(data[i+1][j], data[i+1][j+1]);
                    else if(j==10) data[i][j] += max(data[i+1][j-1], data[i+1][j]);
                    else data[i][j] += max(data[i+1][j-1], data[i+1][j], data[i+1][j+1]);
                }
            }
            System.out.println(data[0][5]);
        }

    }
}
/*
6
5 1
4 1
6 1
7 2
7 2
8 3
3
5 2
5 1
5 3
0


*/

cpp代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;

//此题目必须用一个二维数组占存所有的T时数据, 不能换成两个一维数组 
int dp[100005][12];//第t秒在第x位置所接陷饼数
int max(int a,int b)
{
    return a>b?a:b;
}
int max(int a,int b,int c)
{
    int q=a>b?a:b;
    int w=b>c?b:c;
    return q>w?q:w;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n)
    {
        int maxn=0;
        memset(dp,0,sizeof(dp));
        while(n--)
        {
            int t=0,x=0;
            scanf("%d%d",&x,&t);
            dp[t][x]++;
            if(maxn<t)maxn=t;
        }
        for(int i=maxn-1;i>=0;i--)
        {
            for(int j=0;j<=10;j++)
            {
                if(j==0)
                {
                    dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
                }
                else if(j==10)
                {
                    dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j-1]);
                }
                else
                {
                    dp[i][j]=dp[i][j]+max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
                }
            }
        }
        printf("%d\n",dp[0][5]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_38024592/article/details/79995793