zoukankan      html  css  js  c++  java
  • poj 1036 Gangsters

    http://poj.org/problem?id=1036

    题意:N个土匪,伸缩门的范围是K, 时间T, 伸缩门在【0, k】范围内变动,每个单位时间可以不变伸长或者缩短一个单位。给出每个最烦到达的时刻,取得的成就,和肥胖程度。即如果伸缩门的长度和土匪的肥胖程度一样,即得到成就。

    状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j],dp[i-1][j+1])+a[i][j];

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define ll __int64
     5 using namespace std;
     6 
     7 int dp[2][103];
     8 int t[200],p[200],s[200];
     9 int n,k,t1;
    10 bool vis[300002];
    11 int max1(int a,int b,int c)
    12 {
    13     return (a>b?a:b)>c?(a>b?a:b):c;
    14 }
    15 
    16 
    17 int main()
    18 {
    19     while(scanf("%d%d%d",&n,&k,&t1)!=EOF)
    20     {
    21         memset(vis,false,sizeof(vis));
    22         for(int i=1; i<=n; i++){
    23             scanf("%d",&t[i]);
    24             vis[t[i]]=true;
    25         }
    26         for(int i=1; i<=n; i++)
    27             scanf("%d",&p[i]);
    28         for(int i=1; i<=n; i++)
    29             scanf("%d",&s[i]);
    30         memset(dp,0,sizeof(dp));
    31         for(int i=0; i<=t1; i++)
    32         {
    33             for(int j=1; j<=k+1&&j<=i; j++)
    34             {
    35                 int sum=0;
    36                 if(vis[i])
    37                 {
    38                     for(int c=1; c<=n; c++)
    39                     {
    40                         if(s[c]==j&&t[c]==i)
    41                         {
    42                             sum+=p[c];
    43                         }
    44                     }
    45                 }
    46                 if(j==1)
    47                 {
    48                    dp[i&1][j]=max(dp[(i-1)&1][j],dp[(i-1)&1][j+1])+sum;
    49                 }
    50                 else if(j==k)
    51                 dp[i&1][j]=max(dp[(i-1)&1][j],dp[(i-1)&1][j-1])+sum;
    52                 else
    53                     dp[i&1][j]=max1(dp[(i-1)&1][j],dp[(i-1)&1][j-1],dp[(i-1)&1][j+1])+sum;
    54             }
    55         }
    56         int ans=0;
    57         for(int i=1; i<=k+1; i++)
    58         {
    59             ans=max(ans,dp[t1&1][i]);
    60         }
    61         printf("%d
    ",ans);
    62     }
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    ReentrantLock与synchronized的差别
    读TIJ -1 对象入门
    wikioi 2573 大顶堆与小顶堆并用
    开源 免费 java CMS
    UVA10972
    springboot5
    spring-boot4
    spring-boot3
    spring-boot2
    spring-boot1
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3872621.html
Copyright © 2011-2022 走看看