动态规划——hdu1176免费馅饼

来源:互联网 发布:虚荣英雄数据 编辑:程序博客网 时间:2024/06/05 21:16

/*设计的算法时间空间复杂度都较高,但是AC了,希望大神能够指点改进*/

#include<cstdio>#include<cmath>#include<algorithm>#define maxn 100010using namespace std;int a[15][maxn],dp[15][maxn];//dp[i][j]表示第i个位置第j天int main(){    int n;    while(scanf("%d",&n)&&n != 0)    {        int x,t,tmaxn = 0;        //赋初值        for(int i = 0; i <= 10; i++)            for(int j = 0; j <= maxn; j++)                a[i][j] = dp[i][j] = 0;        for(int i = 1; i <= n; i++)        {            scanf("%d%d",&x,&t);            a[x][t]++;//对应位置累计天数            if(t > tmaxn)                tmaxn = t;        }        for(int j = 1; j <= tmaxn; j++)            for(int i = 0; i <= 10; i++)            {             //关键:在可以走到的范围内分情况讨论                if(i <= 5 + j && i >= 5 - j)                {                    if(i == 0)                        dp[i][j] = max(dp[i + 1][j - 1] + a[i][j],dp[i][j - 1] + a[i][j]);                    else if(i == 10)                        dp[i][j] = max(dp[i - 1][j - 1] + a[i][j],dp[i][j - 1] + a[i][j]);                    else                        dp[i][j] = max(dp[i - 1][j - 1] + a[i][j],max(dp[i + 1][j - 1] + a[i][j], dp[i][j - 1] + a[i][j]));                }            }        int max1 = 0;        //找到最优解        for(int i = 0; i <= 10; i++)        {            if(dp[i][tmaxn] > max1)                max1 = dp[i][tmaxn];        }        printf("%d\n",max1);    }    return 0;}


原创粉丝点击