uva 1427 - Parade 游行 需要优化!

来源:互联网 发布:淘宝炸鱼鱼雷在哪卖 编辑:程序博客网 时间:2024/06/06 04:56


题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4173



状态表示和转移都不难,需要优化,我用了优先队列辅助。


/**========================================== *   This is a solution for ACM/ICPC problem * *   @source:uva 1427 - Parade *   @type:  dp *   @author: wust_ysk *   @blog:  http://blog.csdn.net/yskyskyer123 *   @email: 2530094312@qq.com *===========================================*/#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<queue>using namespace std;typedef long long ll;const int INF =0x3f3f3f3f;const int maxn= 100   ;const int maxm= 10000   ;int n,m,k;int val[maxn+4][maxm+4];int dis[maxn+4][maxm+4];int sum[maxn+4][maxm+4];int sVal[maxn+4][maxm+4];int dp[maxn+4][maxm+4];struct Node{    int val,dis;    Node(){}    Node(int val,int dis):val(val),dis(dis){}    bool operator<(const Node y) const    {        return val<y.val;    }};priority_queue<Node>  q;void input(){      for(int i=0;i<=n;i++)      {            sVal[i][0]=0;            for(int j=1;j<=m;j++)            {                scanf("%d",&val[i][j]);                sVal[i][j]=sVal[i][j-1]+val[i][j];            }      }        for(int i=0;i<=n;i++)      {            sum[i][0]=0;            for(int j=1;j<=m;j++)            {                scanf("%d",&dis[i][j]);                sum[i][j]=sum[i][j-1]+dis[i][j];            }      }}void work(){    memset(dp[n+1],0,(m+1) *sizeof dp[n+1][0]);    for(int i=n;i>=0;i--)    {//        memset(dp[i],0,(m+1) *sizeof dp[i][0]);        while(!q.empty())  q.pop();        for(int j=0;j<=m;j++)        {            q.push(Node( dp[i+1][j]+sVal[i][m]-sVal[i][j],sum[i][j])  );            while(!q.empty())            {                Node now=q.top();                if(abs(now.dis - sum[i][j])>k  )                {                    q.pop();                    continue;                }                dp[i][j]=now.val-(sVal[i][m]-sVal[i][j]);                break;            }        }        while(!q.empty())  q.pop();         for(int j=m;j>=0;j--)        {            q.push(Node( dp[i+1][j]+sVal[i][j]-sVal[i][0],sum[i][j])  );            while(!q.empty())            {                Node now=q.top();                if(abs(now.dis - sum[i][j])>k  )                {                    q.pop();                    continue;                }                dp[i][j]=max(dp[i][j],now.val-sVal[i][j] );                break;            }        }    }    int ans=0;    for(int j=0;j<=m;j++)    {        ans=max(ans,dp[0][j]);    }    printf("%d\n",ans);}int main(){    while(~scanf("%d%d%d",&n,&m,&k)&&(n+m+k))    {        input();        work();    }   return 0;}


0 0
原创粉丝点击