• poj 3034 动态规划


    思路:这是一道坑爹的动态规划,思路很容易想到,就是细节。

    用dp[t][i][j],表示在第t时间,锤子停在(i,j)位置能获得的最大数量。那么只要找到一个点转移到(i,j)收益最大即可。

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 2000010
    #define Maxm 80002
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-x))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define inf 100000
    #define lowbit(x) (x&(-x))
    #define Mod 1000000007
    using namespace std;
    int dp[13][100][100],g[13][100][100];
    int get_num(int t,int x1,int y1,int x2,int y2)
    {
        int i,j;
        if(x1>x2){
            swap(x1,x2);
            swap(y1,y2);
        }
        int l,r,sum=0;
        if(x1==x2){
            l=min(y1,y2);
            r=max(y1,y2);
            for(i=l;i<=r;i++){
                sum+=g[t][x1][i];
            }
            return sum;
        }
        if(y1==y2){
            l=min(x1,x2);
            r=max(x1,x2);
            for(i=l;i<=r;i++){
                sum+=g[t][i][y1];
            }
            return sum;
        }
        for(i=x1;i<=x2;i++){
            if((i-x1)*(y2-y1)%(x2-x1)==0){
                sum+=g[t][i][(i-x1)*(y2-y1)/(x2-x1)+y1];
            }
        }
        return sum;
    }
    int main()
    {
        int n,d,m,t,i,j,x,y,z,k,T;
        while(scanf("%d%d%d",&n,&d,&m)!=EOF,n||m||d){
            memset(dp,0,sizeof(dp));
            memset(g,0,sizeof(g));
            T=0;
            int ans=0;
            for(i=1;i<=m;i++){
                scanf("%d%d%d",&x,&y,&z);
                g[z][x+d+1][y+d+1]=1;
                T=max(T,z);
            }
            n+=2*d+2;
            for(t=1;t<=T;t++){
                for(i=1;i<=n;i++){
                    for(j=1;j<=n;j++){
                        for(x=i-d;x<=i+d;x++){
                            for(y=j-d;y<=j+d;y++){
                                if(x<=0||x>n||y<=0||y>n) continue;
                                if((x-i)*(x-i)+(y-j)*(y-j)<=d*d){
                                dp[t][i][j]=max(dp[t][i][j],dp[t-1][x][y]+get_num(t,i,j,x,y));
                                ans=max(ans,dp[t][i][j]);
                                }
                            }
                        }
                    }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    google
    学习Linux第六天
    对比教学大纲
    周 记
    《世界是数字的》读后感
    《我是一只IT小小鸟》读后感
    前端小知识
    JavaScript 执行机制
    执行栈和任务队列
    支付宝前端员工培训手册
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3300831.html
Copyright © 2020-2023  润新知