zoukankan      html  css  js  c++  java
  • UVALive 6853(dp)

    题意:已知有n个城市,某歌手每月进行一场演唱会,共持续c个月,可连续两个月在同一个城市。城市间的路费已给出,且已知每个城市在第k(1<=k<=c)个月举办演唱会的所得利润,求最终的最大利润。

    分析:第i个月在第j个城市举办演唱会,最终可得最大利润,由此可得状态转移方程:dp[i][j] = max(dp[i][j], dp[i - 1][k] - d[k][j] + a[j].v[i])。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<string>
     5 #include<algorithm>
     6 #include<cstdlib>
     7 #include<cmath>
     8 using namespace std;
     9 const int MAXN = 100 + 10;
    10 struct
    11 {
    12     int v[55];
    13 }a[MAXN];
    14 int d[MAXN][MAXN];
    15 int dp[MAXN][MAXN];
    16 int main()
    17 {
    18     int n;
    19     scanf("%d", &n);
    20     while(n--)
    21     {
    22         memset(d, 0, sizeof d);
    23         memset(dp, 0, sizeof dp);
    24         int s, c;
    25         scanf("%d%d", &s, &c);
    26         for(int i = 1; i <= s; ++i)
    27             for(int j = 1; j <= c; ++j)
    28                 scanf("%d", &a[i].v[j]);
    29         for(int i = 1; i <= s; ++i)
    30             for(int j = 1; j <= s; ++j)
    31                 scanf("%d", &d[i][j]);
    32         for(int i = 1; i <= s; ++i)
    33             dp[1][i] = a[i].v[1];
    34         for(int i = 2; i <= c; ++i)
    35             for(int j = 1; j <= s; ++j)
    36                for(int k = 1; k <= s; ++k)
    37                     dp[i][j] = max(dp[i][j], dp[i - 1][k] - d[k][j] + a[j].v[i]);
    38         int ans = 0;
    39         for(int i = 1; i <= s; ++i)
    40             ans = max(ans, dp[c][i]);
    41        printf("%d\n", ans);
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    [ AHOI 2013 ] 作业 & [ BZOJ 3809 ] Gty的二逼妹子序列
    [ CQOI 2018 ] 异或序列
    [ Luogu 3709 ] 大爷的字符串题
    偷学笔记
    ZJOI2019 补题记录
    Bluestein's Algorithm
    「九省联考 2018」制胡窜
    Codeforces 1349D Bear and Biscuits
    AGC021E Ball Eat Chameleons
    AGC036F Square Constraints
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/5889042.html
Copyright © 2011-2022 走看看