dp 问题滚动数组优化
题目:买卖股票的最佳时机 IV
原题链接
当每次状态转移只依赖于上一个状态时,可以通过机械方式将 dp 问题的空间优化为滚动数组:
1234567891011121314151617181920212223class Solution { public: int maxProfit(int k, vector<int>& prices) { int n = prices.size(); // 第一维设置为 2 vector<vector<int>> f(2, vector<int>(k + 1, -1e8)); auto g = f; int res = 0; f[0][0] = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j <= k; j++) { // 第一维都加上 & 1,相当于模 2,从而在 f[0] 和 f[1] 进行滚动 ...
C++ 匿名函数
C++ sort 比较函数,lambda 和结构体写法:
12345678910struct comp { bool operator()(const int x, const int y) { return x < y; }};sort(nums.begin(), nums.end(), [](int x, int y) { string a = to_string(x), b = to_string(y); return a+b>b+a;});sort(nums.begin(), nums.end(), comp);
数据量反推时间复杂度
一般 ACM 或者笔试题的时间限制是 1 秒或 2 秒。
在这种情况下,C++代码中的操作次数控制在 10710^7107 为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
n≤30n \le 30n≤30, 指数级别, dfs+剪枝,状态压缩 dp
n≤100n \le 100n≤100 => O(n3)O(n^3)O(n3),floyd,dp
n≤1000n \le 1000n≤1000 => O(n2)O(n^2)O(n2),O(n2logn)O(n^2logn)O(n2logn),dp,二分,朴素版 Dijkstra、朴素版 Prim、Bellman-Ford
n≤10000n \le 10000n≤10000 => O(n∗n)O(n * \sqrt n)O(n∗n),块状链表、分块、莫队
n≤100000n \le 100000n≤100000 => O(nlogn)O(nlogn)O(nlogn) => 各种 sort,线段树、树状数组、set/map、heap、拓扑排序、dijkstra+heap、prim+hea ...
迭代法前序遍历树
12345678910111213141516171819202122232425262728293031/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */class Solution {public: vector<int> preorderTra ...
dfs模板
DFS 模板,不要试图去理解它,感受它!
123456789101112131415vector<vector<int>> ans; // 结果集合void dfs(从什么里面找, 去哪找(第几层/第几个字符), 找什么, path结果) { if(找到一个结果) { ans.push_back(path); // 加入到结果集里 return; } if(剪枝条件) { return; } for(int i=起点;条件;i++) { ...; dfs(从什么里面找, 下一层, 下一层要找的, path 结果); ...; }}
单调栈模板
单调栈解决一类问题:给定一个数组 arr,求每个元素左边第一个比它小的元素的下标。输出一个 L 数组,L[i] 表示 arr 中第 i 个数左边比它小的元素的下标。
原题链接
伪代码:
123456789枚举下标 [1, n) // 只要栈顶元素比当前枚举的大,就出栈 while arr[stk.top()]>=arr[i] stk.pop() // 如果全部出栈了,说明i左边没有比它小的 if stk.empty() L[i]=-1; // 否则i左边第一个比它小的就是栈顶 else L[i]=stk.top(); // 当前下标入栈 stk.push(i)
12345678910111213141516171819202122#include <iostream>using namespace std;const int N = 1e5+10;int stk[N], tt;int main() { int n; cin >> n; for(int i=0;i<n;i++) ...
二分搜索模板
二分搜索不一定要求单调,只要数列可以被一个性质一分为二,分为左右两部分,就可以进行二分。
二分循环中的判断的条件为某个性质,如果想找满足这个性质的第一个数,当中点满足这个性质时,r = mid,不满足的话,l = mid + 1。
如果想找满足这个性质的最后一个数,当中点满足这个性质时,l = mid,不满足的话,r = mid - 1。同时计算中点时要加一 l + r + 1 >> 1。
循环条件为 l<r
出循环时 l == r,用哪个都行
if 后面是 l=mid,前面求mid要+1进行上取整
12345678910111213141516171819202122232425262728293031323334// 判断重点是否满足某个性质bool check(int mid) { ... return ...;}// 能二分的题一定是满足某种性质,分成左右两部分// if的判断条件是让mid落在满足你想要结果的区间内// 找满足某个条件的第一个数 即右半段int bsearch_1(int l, int r){ ...
linux airpods 耳机配对
编辑 /etc/bluetooth/main.conf,加入配置:
1ControllerMode = bredr
重启蓝牙
1sudo bluetoothctl restart
使用 acme 申请 let's encrypt 泛域名证书
安装 acme.sh
1$ curl https://get.acme.sh | sh
dns-api 验证
腾讯云
访问 https://www.dnspod.cn
添加密钥并记录
123$ export DP_Id="ID"$ export DP_Key="TOKEN"$ acme.sh --issue -d zuweiye.com -d *.zuweiye.com --dns dns_dp
阿里云
123$ export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"$ export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"$ acme.sh --issue --dns dns_ali -d zuweiye.com -d *.zuweiye.com
配置 nginx
12345678910111213141516# http(80) -> https(443/ssl)server { listen 8 ...
开公司或者创业你要知道哪些?
产业资本
做企业,没有钱,要去借钱,债权驱动
间接融资,还本付息
金融资本
股权驱动
直接融资,不用还本,也不用付利息
资本都很精明,会有债转股这样的操作,资本借钱给公司,干好了,人家可以转股,干不好,就是负债。
股东自愿投资,承担风险
什么是股权?
股权的三大权力
所有权
也就是产权
谨慎分配所有权,请神容易送神难
工商局,营业执照,
企业最重要的产权证:公司章程
公司章程写明:股东构成,股份比例,决策机制,退出机制
要对投票方式做约定,写清 2/3 通过
约定每年有利润必须分红。但是分红会有很高的税,尽量通过其他方式操作。
也可以约定一切赋予某个人的其他权利
每位股东手里都应该有一份公司章程,工商局也有一份备案
收益权
股东获得企业合法利润分红的权益
企业上市之前尽量不要分所有权,要多分收益权
管理权
在股东大会和董事会行使管理权。也就是说如果没担任职务,看到员工摸鱼不能上去训他
公司治理(和管理是两个概念)
公司形态
个人-个体户。工商户,比如街上摊煎饼的。承担无限责任。啥叫无限责任?就是公司欠钱了你得自己卖方卖车去还
个人独资企业(工作室),黄晓明,范冰冰,是 ...