11.6 贪心猫分鱼干
思路
正着遍历,再反着遍历
代码语法(cpp)
1.创建一个长度为n的数组,并初始化为1:
vector<int> a(n,1)
难点
想不到这个思路
11.10 创意标题匹配
思路
还没看正解 但我的第一反应的解法要考虑不少细节:
- 如下面语法提到的,是+=还是=,要不要+1,是count还是index?
- 末尾,不是{}时要用rfind(分类讨论)
- 什么条件才是true?
语法
- for (auto title : titles) 遍历
- i+=templateStr.substr(i).find('}')+1;
- i=templateStr.substr(i).find('}')+1;错
- substr(i)从位置i开始,取到末尾
- 此时find到的是截取后的第k个
- countj=title.substr(j).find(templateStr.substr(i,count));
- substr(i,count) // 从位置 i 开始,取 count 个字符
其余易错
- while套while,break了但没完全break(有什么更好的办法解决吗?)
- 重复加false:提前发现false,直接给ans+false再break;但在break后还有个+false/true的地方
11.11 徒步旅行的补给问题
思路
- 循环(最初始的思路,复杂)
- dp
- 做这题时总是会想到最小栈,,然后就没往dp想
语法
创建二维数组dp:
vector<vector<int>> dp(n+1, vector<int>(k+1, INT_MAX))- 括号和参数
- INT_MAX
难点
dp
- dp[i][j]:第i天携带j份食物所需的最少钱
- 状态转移:
- 错: dp[i][j]=min(dp[i-d][j-m]+data[i-d]*m)
- 对: dp[i][j]=min(dp[i-1][j-m+1]+data[i-1]*m)
- 因为: d>1重复dp了,已经在d=1里更新了
- 以及: 每天会消耗1,所以对标的是[j-m+1],
- m的含义:前一天买m份
- dp[i-1][j-m+1]:前一天买m份前已经花了多少
- 状态初始:
- 错: dp[0][t]=t*data[0]
- 对: dp[0][0]=0,其余INT_MAX
- 为什么只用[0][0]: 每次是在第二天的dp算上前一天的购买,所以第0天只需记实,在第二天会补的
- 状态结束: dp[n][0]
- 循环的i,j,m:
- j小于k: 因为dp[i]为第(i+1)天购买和消耗前,第i天购买和消耗后(i等于0时为第1天购买和消耗前),所以不可能达到k(这里很奇怪,题目没说清?我的理解同一天是先买再消耗)
- dp[i][j]=min(dp[i-1][j-m+1]+data[i-1]*m)
- 0<=j-m+1<=k && 0<=m<=k
- => max(j+1-k,0)<=m<=min(k,j+1)
11.12 找出整型数组中占比超过一半的数
思路
- 我在力扣做过,所以直接写出来了
- 假定一个为候选者,记录它的票数和反对票,反对票超了就换人
- 为什么可行:换人后可能还会换回来的
易错
初始化
if(b>a){
ans=t;
a=0;
b=0;
}
当换人,票数要清零