随笔分类 -  动态规划

摘要:从后往前#include <stdio.h>int abs(int s){ if(s<0) return -s; return s;}int main(){ int t,n,i,j,a[1010],sum,min,k=1; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); min=abs(a[1]); //printf("%d\n",min); for(i 阅读全文
posted @ 2012-04-25 22:08 shijiwomen 阅读(1213) 评论(1) 推荐(0)
摘要:#include <stdio.h>#include <string.h>#define M 1000char b[M],c[M];int a[M][M];int main(){ int i,j,n,m; while(scanf("%s%s",b+1,c+1)!=EOF) { n=strlen(b+1); m=strlen(c+1); for(i=0;i<=n;i++) a[i][0]=0; for(i=0;i<=m;i++) a[0][i]=0... 阅读全文
posted @ 2012-04-18 09:34 shijiwomen 阅读(158) 评论(0) 推荐(0)
摘要:刚开始做时思路过于局限,只考虑局部的递推,没有全局观导致,越推越复杂,最后看到网上答案,精髓啊#include <iostream>#include <string.h>#include <stdio.h>using namespace std;int max3(int a,int b,int c){ a = a>b?a:b; a = a>c?a:c; return a;}int max2(int a,int b){ a = a>b?a:b; return a;}int t[100001][11];int main(){ int n,T,x 阅读全文
posted @ 2012-04-18 09:24 shijiwomen 阅读(199) 评论(0) 推荐(0)
摘要:#include <stdio.h>int main(){ int n,a[1010],i,j,max,b[1010]; while(scanf("%d",&n),n) { for(i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } max=a[1]; for(i=2;i<=n;i++) { for(j=1;j<i;j++) { if(a[i]>a[j]&&b[i]<a[i]+b[j]) b[i]=a[i]+b[j]; } if(b[i] 阅读全文
posted @ 2012-04-17 17:26 shijiwomen 阅读(197) 评论(0) 推荐(0)
摘要://#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>//using namespace std;const int MAXN=10000;struct ele{ int inte; int weit; int num;}eles[MAXN];int cmp(const void *a,const void *b){ struct ele t=*(struct ele *)a; struct ele l=*(struct ele *)b; if(t 阅读全文
posted @ 2012-04-15 19:49 shijiwomen 阅读(179) 评论(0) 推荐(0)
摘要:注意转头方程#include <stdio.h>#include <string.h>int max(int a,int b){ return a>b?a:b;}int main(){ int t; int n,m; int i,j; int w[30],c[30]; int dp[30001]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=m;i++) scanf("%d%d",&w[i] 阅读全文
posted @ 2012-04-12 11:02 shijiwomen 阅读(335) 评论(0) 推荐(0)
摘要:f[i]=min(f[i],num-strlen(word)+f[i+num])注意数组范围match非常巧妙的运用了j与i的匹配dp两层循环加一个函数(计算距离)#include <stdio.h>#include <string.h>#define maxn 605#define maxl 305int n,m;char str[maxl],map[maxn][maxl];int f[maxl];int min(int k,int t){ return k>t?t:k;}int match(char *st1, char *st2){ if (st1[0] ! 阅读全文
posted @ 2012-04-06 16:17 shijiwomen 阅读(128) 评论(0) 推荐(0)
摘要:一看汉诺塔的次数,第一感觉是数学题,但一看答案是dp出乎意料,对dp有了更加全面的理解,主要是递归的规划,从复杂的递归回归的基础的递归#include <stdio.h>#include <math.h>__int64 ans[65];double _min,temp,f[65];int main(){ int i,j,n; f[0]=1; for(i=1;i<65;i++) f[i]=f[i-1]*2; ans[1]=1; for(i=2;i<65;i++) { _min=pow(2,64)-1; for(j=1;j<i;j++) { temp=2* 阅读全文
posted @ 2012-03-29 20:51 shijiwomen 阅读(234) 评论(0) 推荐(0)
摘要:dp主要是找到状态方程,大多运用双层循环,进行整体最优解的积累,像数塔,时间安排比较困难的就需要循环加条件判断比较,还有比较需要熟悉的是一般都是先从后往前递归出方程,在进行递推编码#include <stdio.h>int main(){ int i,j; int n,c,t; int vt,v1,v2; int len; int p[102]; double e,min,dp[102]={0}; while(scanf("%d",&len)!=EOF) { scanf("%d%d%d",&n,&c,&t); 阅读全文
posted @ 2012-03-28 22:31 shijiwomen 阅读(238) 评论(0) 推荐(0)