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

来源:互联网 发布:sql查询身份证号码 编辑:程序博客网 时间:2024/05/16 18:55

题目链接 打地鼠:点击打开链接

                免费馅饼:点击打开链接


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

对于 免费馅饼 ,因为初态是确定的,接到的第一个馅饼的位置是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;}



0 0
原创粉丝点击