ACM第三次练习—1007

来源:互联网 发布:二手车估价软件 编辑:程序博客网 时间:2024/05/15 08:40

题意:天上掉馅饼,Gameboy每秒种只有在移动不超过一米的范围内接住坠落的馅饼。假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)

思路:跟之前做过的数塔题的思路有些类似,不过这是矩阵,可以这样想:建一个很大的矩阵A,那么A[i][j]表示第i秒第j位置有多少个馅饼,那么我把所有馅饼都填入表(矩阵中),这样我只要从底往上走,走到最上面一层,找到所走过的位置中馅饼之数最大的那个就是我们所求结果,这完全和数塔一样的思维。既然用到了动态规划,那么就必须思考动态规划的3个要素,其中子结构之间存在关系,并且那个递推关系式是很重要的,这是我们在用动态规划解决问题时候必须先思考的。

感想:感觉这题跟前面几个差很远,好难~

代码:

#include<iostream>
#include<cstring>
using namespace std;
int maxi(int a,int b,int c)
{
    int max1;
    max1=a>b?a:b;
    max1=max1>c?max1:c;
    return max1;
}
int max(int a,int b)
{
return a>b?a:b;
}
int c[100001][11];
int main()
{
    int i,j;
    int n,a,b;
    while(cin>>n&&n)
    {
        int m=0;
        memset(c,0,sizeof(c));
        for(i=0;i<n;i++)
        {
             cin>>a>>b;
             c[b][a]++;
             if(m<b)
             m=b;;
        }
        for(i=m-1;i>=0;i--)
        {
            for(j=1;j<=9;j++)
                c[i][j]+=maxi(c[i+1][j-1],c[i+1][j],c[i+1][j+1]);
            c[i][0]+=max(c[i+1][0],c[i+1][1]);
            c[i][10]+=max(c[i+1][10],c[i+1][9]);
        }
        cout<<c[0][5]<<endl;       
    }return 0;
}

0 0