• 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 }
  • 相关阅读:
    最长回文子串(马拉车)
    ubutun 启动/停止/重启MySQL数据库
    臭大佬_LZW
    Beauty Contest(求凸包最大直径)
    Smallest Bounding Rectangle(最小面积外接矩形)
    Triangle(求凸包最大内接三角形)
    P4196 [CQOI2006]凸多边形
    P4724 【模板】三维凸包(简洁)
    P2600 [ZJOI2008]瞭望塔【半平面交】
    退役记
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/5889042.html
Copyright © 2020-2023  润新知