2020-10-24记录题目

看到这个一个等式2020-996=1024
说是今年要是没有996就能过上好日子(hhh
在1024,程序员节这一天,基本敲了一天的代码,但今天又觉得思维被堵住了,没有以往敲题时那种活跃的思维思考,所以我打算把今天思考堵住的用敲下来的方式再重新理清一下思路,会慢慢补题上来的,我相信
今天的力扣有用动态规划的,我一遇到就都有练习怎么去思考:
传送门
在这里插入图片描述刚开始看题解有点懵懵的,后来自己想出来了,现在试着表达我的想法:
首先题目,一个数组储存了一些视频片段,这些视频片段以[开头时间,结尾时间]组成的一个数组
要找出可以剪辑成0到T的片段,因为片段很多,可能有很多种剪辑方法能达成目的,要找出最少的视频片段来剪辑,返回片段数量
我拿道题的想法是,要剪辑成有0到T的视频,也就是说用来剪辑的片段应该要涵盖整个0到T,这样才有可能剪辑,可能用遍历数组来完成,用这个方法判断能不能剪辑成功,思考了一下,应该是O(T*clips.size())
连判断都需要那么久我就pass掉了
之后我的想法是找贡献,一个片段落在0到T的区间多的,总比少的要好,这应该是贪心的想法,但技术原因不知道怎么实现
之后我敲不出来看题解…看到动态规划我又回去想了一下
dp[i]来表示剪辑成0到i所需要的最少片段
首先是初值,当i==0的时候,空片段可以有任何片段剪出来。也就是说,空集是任何集合的子集,
当遍历到片段的时候,如果我已经剪好了0到片段开头的视频,那么我就可以剪辑成0到片段结尾的视频,也就是把这一段片段衔接在总片段之后,如果i已经在这个总片段里面了,那代表用dp[片段开头],也就是剪成0到片段开头要用到的最小的片段数,加上现在的这个片段就可以完成剪辑了。
也就是说状态转移是这样:
dp[i]=每一个片段开头的dp值+1的最小值
还是官方解释的比较好hhh
我们可以枚举所有的子区间来依次计算出所有的 dp 值。我们首先枚举 i,同时对于任意一个子区间 [aj,bj),若其满足 aj<i≤bj,那么它就可以覆盖区间 [0,i) 的后半部分,而前半部分则可以用 dp[ai] +1对应的最优方法进行覆盖,因此我们可以用 dp[aj]+1 来更新 dp[i]
最终的答案即为 dp[T]

class Solution {
public:
    int videoStitching(vector<vector<int>>& clips, int T) 
 {
  vector<int> dp(T+1,INT_MAX-1);
  dp[0]=0;
  for(int i=1;i<=T;i++)
  {
   for(auto&it:clips)
   {
    if(it[0]<i&&i<=it[1])
    {
     dp[i]=min(dp[i],dp[it[0]]+1);
    }
   }
  }
  return dp[T]==INT_MAX-1?-1:dp[T];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值