Sgu 104
较为简单的DP,方程:f[i][j]=max(f[i][j-1],f[i-1][j-1]+v[i][j]),其中f[i][j]为前j个花瓶里放i束花的方法数,则答案为f[F][V].
注意方案的记录
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 int oo=99999999,g[101][101],value[101][101],f,v;
5 int px[101][101],py[101][101],ans[101];
6 bool vis[101][101];
7 void init()
8 {
9 scanf("%d%d",&f,&v);
10 for(int i=1;i<=f;++i)
11 for(int j=1;j<=v;++j)
12 scanf("%d",&value[i][j]);
13 }
14 void dp(int x, int y)
15 {
16 vis[x][y]=true;
17 if(x>y)
18 return;
19 g[x][y]=-oo;
20 if(x<=y-1)
21 {
22 if(!vis[x][y-1]) dp(x,y-1);
23 g[x][y]=g[x][y-1];
24 px[x][y]=x;
25 py[x][y]=y-1;
26 }
27 if(x-1<=y)
28 {
29 if(!vis[x-1][y-1]) dp(x-1,y-1);
30 if(g[x-1][y-1]+value[x][y]>g[x][y])
31 {
32 px[x][y]=x-1;
33 py[x][y]=y-1;
34 g[x][y]=g[x-1][y-1]+value[x][y];
35 }
36 }
37 }
38 void work()
39 {
40 memset(g,0xff,sizeof(g));
41 for(int i=0;i<=v;++i){ g[0][i]=0;px[0][i]=py[0][i]=-1;vis[0][i]=true;}
42 for(int i=1;i<=f;++i){ g[i][i]=g[i-1][i-1]+value[i][i]; px[i][i]=i-1; py[i][i]=i-1;vis[i][i]=true;}
43 dp(f,v);
44 printf("%d\n",g[f][v]);
45 int nowx=f,nowy=v,now=0;
46 while(px[nowx][nowy]!=-1)
47 {
48 int tmpx=px[nowx][nowy];
49 int tmpy=py[nowx][nowy];
50 if(tmpx<nowx) ans[++now]=nowy;
51 nowx=tmpx;
52 nowy=tmpy;
53 }
54 for(int i=now;i>=2;--i) printf("%d ",ans[i]);
55 printf("%d\n",ans[1]);
56 }
57 int main()
58 {
59 init();
60 work();
61 return 0;
62 }
2 #include<stdlib.h>
3 #include<string.h>
4 int oo=99999999,g[101][101],value[101][101],f,v;
5 int px[101][101],py[101][101],ans[101];
6 bool vis[101][101];
7 void init()
8 {
9 scanf("%d%d",&f,&v);
10 for(int i=1;i<=f;++i)
11 for(int j=1;j<=v;++j)
12 scanf("%d",&value[i][j]);
13 }
14 void dp(int x, int y)
15 {
16 vis[x][y]=true;
17 if(x>y)
18 return;
19 g[x][y]=-oo;
20 if(x<=y-1)
21 {
22 if(!vis[x][y-1]) dp(x,y-1);
23 g[x][y]=g[x][y-1];
24 px[x][y]=x;
25 py[x][y]=y-1;
26 }
27 if(x-1<=y)
28 {
29 if(!vis[x-1][y-1]) dp(x-1,y-1);
30 if(g[x-1][y-1]+value[x][y]>g[x][y])
31 {
32 px[x][y]=x-1;
33 py[x][y]=y-1;
34 g[x][y]=g[x-1][y-1]+value[x][y];
35 }
36 }
37 }
38 void work()
39 {
40 memset(g,0xff,sizeof(g));
41 for(int i=0;i<=v;++i){ g[0][i]=0;px[0][i]=py[0][i]=-1;vis[0][i]=true;}
42 for(int i=1;i<=f;++i){ g[i][i]=g[i-1][i-1]+value[i][i]; px[i][i]=i-1; py[i][i]=i-1;vis[i][i]=true;}
43 dp(f,v);
44 printf("%d\n",g[f][v]);
45 int nowx=f,nowy=v,now=0;
46 while(px[nowx][nowy]!=-1)
47 {
48 int tmpx=px[nowx][nowy];
49 int tmpy=py[nowx][nowy];
50 if(tmpx<nowx) ans[++now]=nowy;
51 nowx=tmpx;
52 nowy=tmpy;
53 }
54 for(int i=now;i>=2;--i) printf("%d ",ans[i]);
55 printf("%d\n",ans[1]);
56 }
57 int main()
58 {
59 init();
60 work();
61 return 0;
62 }