HDU 4540 威威猫系列故事——打地鼠(树塔问题简单变形)

来源:互联网 发布:vip域名被百度收录 编辑:程序博客网 时间:2024/06/05 10:21

题目地址:点击打开链接

思路:水题,第一次投TLE了,结果改了一下,也TLE了,结果是忘了加!=EOF了,看上面TLE的那个代码也忘加了,加上之后也过了,把2个都贴一下吧

AC代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>using namespace std;int dp[25][510];int main(){    int n,m,k;    int i,j,l,min1;    while(scanf("%d%d",&n,&k) != EOF)    {        memset(dp,0,sizeof(dp));        for(i=1; i<=k; i++)        {            scanf("%d",&m);            dp[1][m] = 1;        }        for(i=2; i<=n; i++)        {            for(j=1; j<=k; j++)            {                scanf("%d",&m);                min1 = INT_MAX;                for(l=1; l<=500; l++)                {                    if(dp[i-1][l] && dp[i-1][l] + abs(m-l) < min1)                    {                        min1 = dp[i-1][l] + abs(m-l);                    }                }                dp[i][m] = min1;            }        }        min1 = INT_MAX;        for(i=1; i<=500; i++)        {            if(dp[n][i] && dp[n][i] < min1)                min1 = dp[n][i];        }        printf("%d\n",min1-1);    }    return 0;}

这个代码不如第二个效率高,数据多点就真的TLE了

AC代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>using namespace std;int dp[25][15],a[25][15];int main(){    int n,m,k;    int i,j,l,min1;    while(scanf("%d%d",&n,&k) != EOF)    {        memset(dp,0,sizeof(dp));        for(i=1; i<=k; i++)        {            scanf("%d",&m);            a[1][i] = m;        }        for(i=2; i<=n; i++)        {            for(j=1; j<=k; j++)            {                scanf("%d",&m);                a[i][j] = m;                min1 = INT_MAX;                for(l=1; l<=k; l++)                {                    if(dp[i-1][l] + abs(m-a[i-1][l]) < min1)                    {                        min1 = dp[i-1][l] + abs(m-a[i-1][l]);                    }                }                dp[i][j] = min1;            }        }        min1 = INT_MAX;        for(i=1; i<=k; i++)        {            if(dp[n][i] < min1)                min1 = dp[n][i];        }        printf("%d\n",min1);    }    return 0;}


0 0
原创粉丝点击