首页 > 代码库 > SGU 104

SGU 104

简单DP。递推关系式:f[i,j]=max{f[i-1,k]}+value[i,j].其中,i>=2,i<=j<=V-F+i,i-1<=k<j(原程序中貌似写成了i<=k<j TUT 不知道怎么AC的- -V是空间数,F是花的总数。
#include "stdio.h"#include "string.h"const int MAXF=100,MAXV=100;int main(){	int f[MAXF+2][MAXV+2],g[MAXF+2][MAXV+2];	short val[MAXF+2][MAXV+2];	int stack[MAXF+2];	int i,j,k,F,V,max,m,top=0;	scanf("%d%d",&F,&V);	for(i=1;i<=F;i++){		for(j=1;j<=V;j++){			scanf("%d",&val[i][j]);		}	}	for(i=1;i<=V-F+1;i++){		f[1][i]=val[1][i];	}	for(i=2;i<=F;i++){		for(j=i;j<=V-F+i;j++){			max=-96666;			for(k=i;k<j;k++){				if(max<f[i-1][k]){					max=f[i-1][k];					m=k;				}			}			f[i][j]=max+val[i][j];			g[i][j]=m;		}	}	max=-99999;	for(i=F;i<=V;i++){		if(max<f[F][i]){			max=f[F][i];			m=i;		}	}	memset(stack,0,sizeof(stack));	stack[1]=m;top=1;	printf("%d\n",max);	for(i=F-1;i>=1;i--){		top++;stack[top]=g[i+1][stack[top-1]];	}	for(i=top;i>=1;i--){		printf("%d",stack[i]);		if(i!=1)printf(" ");	}	return 0;}