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