• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
DementRock
   首页          管理     

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].

注意方案的记录

sgu104
 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 }


 

posted @ 2010-02-16 23:43  DementRock  阅读(374)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3