小算法总结
最大子序列和
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\n",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
可以很明显的看出,埃氏筛法确实快。复习一下!!
多做点记录,只有好处,没坏处。认真一点,进个大公司!

浙公网安备 33010602011771号