C ++中的最长假期天数

假设一家公司希望为其最优秀的员工之一提供在N个城市之间旅行以收集一些资源的选择。但是员工也想要一些假期,我们可以在某些特定城市和几周内休假。我们的任务是安排旅行,以使我们可以休假的天数最大化,但是必须遵守某些规则和限制。

  • 我们只能在N个城市之间旅行;它们由从0到N-1的索引表示。首先,我们星期一在索引为0的城市中。

  • 这些城市由航班连接。我们有一个N x N矩阵(不一定对称)来表示飞行。代表从城市i到城市j的航空公司状态的航班。如果没有从城市i到城市j的航班,则矩阵航班[i] [j]将为0;否则,flights [i] [j] =1。此外,所有i的flights [i] [i] = 0。

  • 我们有K周旅行。我们每天最多只能搭乘一次航班,并且只能在每个星期的星期一早晨搭乘航班。

  • 对于每个城市,我们只能在不同的星期中有限制的假期,因为我们有一个N * K矩阵,称为天,这说明了这种关系。对于days [i] [j]的值,它表示第j周我们在城市i可以休假的最长时间。

因此,如果我们有排期矩阵和天数矩阵,并且我们需要输出在K周内可以使用的最大休假天数。

因此,如果输入就像排期= [[0,1,1],[1,0,1],[1,1,0]],则天= [[1,3,1],[6,0 ,3],[3,3,3]],则输出为12

为了解决这个问题,我们将遵循以下步骤-

  • n:=排航班

  • m:=天矩阵的列

  • 定义一个尺寸为(m + 1)xn的2D数组dp

  • 对于初始化i:= m-1,当i> = 0时,更新(将i减1),-

    • 对于初始化k:= 0,当k <n时,更新(将k增加1),-

    • dp [i,j]:= dp [i,j]和天[j,i] + dp [i + 1,k]的最大值

    • 如果j与k相同或flights [j,k]不为零,则-

    • 对于初始化j:= 0,当j <n时,更新(将j增加1),执行-

    • ret:= dp [0,0]

    • 对于初始化i:= 1,当i <n时,更新(将i增加1),-

      • ret:= ret和dp [0,i]的最大值

      • 如果flight [0,i]不为零,则-

    • 返回ret

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
          int n = flights.size();
          int m = days[0].size();
          vector<vector<int> > dp(m + 1, vector<int>(n));
          for (int i = m - 1; i >= 0; i--) {
             for (int j = 0; j < n; j++) {
                for (int k = 0; k < n; k++) {
                   if (j == k || flights[j][k]) {
                      dp[i][j] = max(dp[i][j], days[j][i] + dp[i + 1][k]);
                   }
                }
             }
          }
          int ret = 0;
          ret = dp[0][0];
          for (int i = 1; i < n; i++) {
             if (flights[0][i]) {
                ret = max(ret, dp[0][i]);
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v1 = {{0,1,1},{1,0,1},{1,1,0}}, v2 = {{1,3,1},{6,0,3},{3,3,3}};
       cout << (ob.maxVacationDays(v1, v2));
    }

    输入值

    v1 = {{0,1,1},{1,0,1},{1,1,0}}, v2 = {{1,3,1},{6,0,3},{3,3,3}}

    输出结果

    12