小算法总结

最大子序列和

dp转移方程  sum[i] = max{sum[i-1]+a[i],a[i]}

int MaxSum(int n)
{
    int sum=0,tmp=0;
    for(int i=0;i<n;i++)
    {
        if(tmp>0)
            tmp+=a[i];
        else
            tmp=a[i];
        if(tmp>sum)
            sum=tmp;
    }
    return sum;
}

  

递归求全排列

先处理第一层,比如123  第一位置分别和第一个位置、第二个位置、第三个位置交换 ->{123  213  321}

再递归处理第二层  比如 123 第二位置分别和第二位置、第三位置交换 ->{ 123 132}

再递归处理第三层 比如 123 第三位置和第三位置交换 ->{123}

然后就是回溯分别处理

#include <stdio.h>
#include <algorithm>
using namespace std;

int ans = 0;

void permutation(int k, int n, int a[])
{
    if(k == n-1){
        ans+=1;
        for(int i = 0; i < n; ++i)
            printf("%d ", a[i]);
        puts("");
    }else{
        for(int i = k; i < n; ++i){
            swap(a[k],a[i]);
            permutation(k+1, n, a);
            swap(a[k],a[i]);
        }
    }
}

int main()
{
    freopen("1.txt","w",stdout);
    int a[100];
    int n = 3;
    for(int i = 0; i < n; ++i)
        a[i] = i+1;
    permutation(0, n, a);
    printf("%d
",ans);
    return 0;
}

  

筛素数

import timeit

def eratosthenes(n):
    l = list(range(1,n+1))
    l[0] = 0
    for i in xrange(2, n+1):
        if l[i-1] != 0:
            for j in xrange(i*2, n+1, i):
                l[j-1] = 0
    result = [x for x in l if x != 0]

    return result

def sushu(n):
    result = []
    for x in xrange(2,n+1):
        for y in xrange(2,x):
            if x % y == 0:
                break
        else:
            result.append(x)
    return result

t1 = timeit.Timer('print sushu(10000)', setup='from __main__ import sushu')
t2 = timeit.Timer('print eratosthenes(10000)', setup='from __main__ import eratosthenes')

print t1.timeit(1)
print t2.timeit(1)

 0.284128189087

 0.002876996994

可以很明显的看出,埃氏筛法确实快。复习一下!!

 多做点记录,只有好处,没坏处。认真一点,进个大公司!

原文地址:https://www.cnblogs.com/ya-cpp/p/7622997.html