您的位置:首页 > 其它

HDU4540 威威猫系列故事——打地鼠 and 1176免费馅饼

2014-07-14 16:15 78 查看
题目链接 打地鼠:点击打开链接

免费馅饼:点击打开链接

这两道题有相似之处,却又有所不同。

对于 免费馅饼 ,因为初态是确定的,接到的第一个馅饼的位置是5(题意已给),所以用从下往上的dp较为方便。而打地鼠,初态和末态都不确定,所以初始与末尾的地位是对等的,所以从上往下和从下往上的处理是一样一样的。结果也如所料,提交了这两种代码都可以过,因为它们本质是相同的。

这两道题,唯一的区别,也就是dp找最值时略有不同。免费馅饼只需从j-1,j,j+1这三个中求最值。而打地鼠则要扫描整个这一层。

打地鼠代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<cmath>
using namespace std;
const int M=100000;
int main()
{
    int a[50][50],dp[50][50];
    int n,k,i,j;
    while(cin>>n>>k)
    {
        memset(dp,0,sizeof(dp));
        for(i=0; i<n; i++)
        {
            for(j=0; j<k; j++)
                cin>>a[i][j];

        }
        for(i=n-2; i>=0; i--)
        {
            for(j=0; j<k; j++)
            {
                int tmp=100000;
                for(int c=0; c<k; c++)
                    if(tmp>dp[i+1][c]+abs(a[i][j]-a[i+1][c]))
                        tmp=dp[i+1][c]+abs(a[i][j]-a[i+1][c]);
                dp[i][j]=tmp;
            }
        }
        int Min=dp[0][0];
        for(i=0; i<k ; i++)
        {
            if(Min>dp[0][i])
                Min=dp[0][i];
        }
        cout<<Min<<endl;
    }

    return 0;

}


免费馅饼代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<cmath>
using namespace std;
int a[12][100000];
int sum[12][100000];
int main()
{
    int n;
    while(cin>>n && n)
    {
        int Maxi=0,Maxj=0,cnt;
        memset(a,0,sizeof(a));
        memset(sum,0,sizeof(sum));
        int i,j;
        for(cnt=0; cnt<n; cnt++)
        {
            cin>>i>>j;
            a[i][j]++;
            if(Maxi<i) Maxi=i;
            if(Maxj<j) Maxj=j;

        }
        for(j=Maxj; j>=0; j--)
        {
            for(i=0; i<=Maxi; i++)
            {
                if(j==Maxj)
                {
                    sum[i][j]=a[i][j];
                }
                else
                {
                    if(i>0)
                        sum[i][j]=a[i][j]+max(sum[i-1][j+1],max(sum[i][j+1],sum[i+1][j+1]));
                    else sum[i][j]=a[i][j]+max(sum[i][j+1],sum[i+1][j+1]);
                }

            }
        }
        cout<<sum[5][0]<<endl;

    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: