给定长为n的数组,切m-1刀成为m段,每段求和,获得m个和。记m个和的最大值为max,求所有可能切法产生的max的最小值。
要点:二维动态规划,转移函数 f ( m , n ) = m i n 遍 历 k ( m a x ( f ( m − 1 , n − k ) , s u m ( x k : ) ) ) f(m,n) = min_{遍历k}(max(f(m-1,n-k), sum(x_k:))) f(m,n)=min遍历k(max(f(m−1,n−k),sum(xk:)))
#include<iostream>
#include<vector>
using namespace std;
int s(vector<int> v, int start, int end){
int sum=0;
for(int i=start; i<=end; i++)sum+=v[i];
return sum;
}
int larger(int a, int b){
if(a>b) return a;
else return b;
}
int smaller(int a, int b){
if(a<b) return a;
else return b;
}
int f(vector<int> v, int m, int n){
if(n==m){
int x=v[0];
for(int i=1;i<v.size(); i++){
if(v[i]>x)x=v[i];
}
return x;
}
if(m==1){
int sum=v[0];
for(int i=1; i<v.size(); i++){
sum+=v[i];
}
return sum;
}
vector<vector<int> > dp;
vector<int> afterCutOnce;
afterCutOnce.push_back(v[0]);
for(int j=1; j<n; j++){
afterCutOnce.push_back(afterCutOnce[j-1]+v[j]);
}
dp.push_back(afterCutOnce);
for(int i=1; i<m; i++){
vector<int> afterACut;
for(int j=0; j<i; j++)afterACut.push_back(INT_MIN);
for(int j=i; j<n; j++){
int min=larger(dp[i-1][j-1],v[j]);
for(int k=0; k<j-2; k++)min=smaller(min, larger(dp[i-1][j-2-k],s(v, j-1-k, j)));
afterACut.push_back(min);
}
dp.push_back(afterACut);
}
for(int i=0;i<dp.size();i++){
for(int j =0;j<dp[i].size();j++){
cout<<dp[i][j]<<' ';
}
cout<<endl;
}
return dp[m-1][n-1];
}
int main()
{
vector<int> v;
for(int i=0;i<4;i++)v.push_back(6-i);
cout<<f(v, 2, 4)<<endl;
return 0;
}
删除BST的指定节点
要点:一边查,一边删。用void类型函数可能产生野指针。
#include<iostream>
using namespace std;
struct node{
int v;
node *l;
node *r;
node(int va, node *le, node *ri){
v=va;
l=le;
r=ri;
}
};
node* deleteNode(node* root, int key) {
if (root==NULL) return NULL;
if (root->v > key) {root->l = deleteNode(root->l, key);}
else if (root->v < key) {root->r = deleteNode(root->r, key);}
else {
if (!root->l || !root->r) {root = (root->l)?root->l:root->r;}
else {
node *cur = root->r;
while (cur->l) cur = cur->l;
root->v = cur->v;
root->r = deleteNode(root->r, cur->v);
}
}
return root;
}
void printPre(node *root){
if(root==NULL)return;
cout<<root->v;
printPre(root->l);
printPre(root->r);
}
void printMid(node *root){
if(root==NULL)return;
printMid(root->l);
cout<<root->v;
printMid(root->r);
}
int main()
{
node *n4 = new node(4, NULL, NULL);
node *n3 = new node(3, NULL, n4);
node *n5 = new node(5, n3, NULL);
node *n1 = new node(1, NULL, NULL);
node *n2 = new node(2, n1, n5);
node *n8 = new node(8, NULL, NULL);
node *root = new node(6, n2, n8);
printPre(root);cout<<endl;
printMid(root);cout<<endl;
root=deleteNode(root, 2);
printPre(root);cout<<endl;
printMid(root);cout<<endl;
}
NMS
要点:索引排序
def nms(bbox, threshold):
index = np.argsort(bbox, axis=0)
keep = np.ones(bbox.shape[0], dtype=np.int)
for i in range(index.shape[0]-1, 0, -1):
if keep[i]==1:
for j in range(i):
if keep[j]==1:
if iou(bbox[i], bbox[j])>threshold:
keep[j]=0
rslt=list()
for i in range(index.shape[0]-1):
if keep[i]==1:
rslt.append(bbox[i])
return rslt