算法题(313)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tfcy694/article/details/88530252
给定长为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:)))

#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
    

猜你喜欢

转载自blog.csdn.net/tfcy694/article/details/88530252