1.4键键盘
其实就是要么直接输入数字 每次+1 要么复制 复制就看几次了 所以这个得到复制值不断比较即可
不知道为什么我的超出时间限制
class Solution {
public:
int maxA(int N) {
vector<int>dp(N+2,0);
for(int i=1;i<=3;i++){
dp[i]=i;
}
for(int i=4;i<=N;i++){
int t=3;
while(i-t>0)
dp[i]=max(dp[i-1]+1,dp[i]);
dp[i]=max(dp[i],(t-1)*dp[i-t]);
t++;
}
return dp[N];
}
};
这是人家的代码(很显然我的思路没任何问题嘛对不对)
class Solution {
public:
int maxA(int N) {
vector<int>dp(N+1,0);
for(int i=1;i<=N;i++){
dp[i]=i;
for(int j=1;j<i-2;j++){
dp[i]=max(dp[i],(i-j-1)*dp[j]);
}
}
return dp[N];
}
};
2.无重叠区间
贪心算法我感觉啥都没有呢 没有任何意义 不就是正常做吗
这道题涉及到一个vector按第二个元素排序问题
写一个函数 排序
class Solution {
public:
static bool cmp(vector<int>data1,vector<int>data2){
return data1[1]<data2[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size()==0){
return 0;
}
int res=0;
sort(intervals.begin(),intervals.end(),cmp);
int end=intervals[0][1];
for(int i=1;i<intervals.size();i++){
if(intervals[i][0]<end){
res++;
}
else{
end=intervals[i][1];
}
}
return res;
}
};
3.用最少数量的箭引爆气球
这个就是一道简单的动态规划 区间问题之前已经做过两道了(合并区间和插入区间)
原理相同,就是说如果区间有重叠,就求交集,然后继续向后求交集,直到没有交集数量res就再加1
并以当前的值为temp
自己做的
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
if(points.size()==0){return 0;}
if(points.size()==1){return 1;}
sort(points.begin(),points.end());
vector<int> cur=points[0];
int res=1;
for(int i=1;i<points.size();i++){
if(cur[1]>=points[i][0]){
cur[0]=max(cur[0],points[i][0]);
cur[1]=min(cur[1],points[i][1]);
}
else{
res++;
cur=points[i];
}
}
return res;
}
};