zoukankan      html  css  js  c++  java
  • POJ3230(Travel)

    题目链接

    动态规划题,题目大意,有n个城市,一个人从第一个出发,每天可以选择继续呆在当前城市或者转移到其他城市(可以把继续呆在当前城市看成从当前城市转移到当前城市),第i天呆在第j个城市的收入为in[i][j],从第i个城市转移到第j个城市的费用out[i][j],求m天后的最大收入。把第k天的收入与第k-1天的收入联系起来即可写出状态转移方程。用c[i][j]保存i天过后最后呆在城市j的总收入,c[i][j]=MAX(c[i-1][k]+in[i][j]-out[k][j],k=0,1,...n-1),注意到从第一个城市出发,所以边界为第一天结束时的收入。

    View Code
     1 #include <stdio.h>
    2 #include <string.h>
    3 #define N 101
    4 #define MAX(a,b) ((a)>(b)?(a):(b))
    5 char vis[N][N];
    6 int c[N][N],out[N][N],in[N][N],n,m;
    7 int f(int i,int j)
    8 {
    9 int max,k;
    10 if(vis[i][j]) return c[i][j];
    11 if(i==1)
    12 {
    13 vis[i][j]=1,c[i][j]=in[1][j]-out[0][j];
    14 return 0;
    15 }
    16 max=f(i-1,j)+in[i][j]-out[j][j];
    17 for(k=0; k<n; k++)
    18 {
    19 max=MAX(max,f(i-1,k)+in[i][j]-out[k][j]);
    20 }
    21 c[i][j]=max;
    22 vis[i][j]=1;
    23 return c[i][j];
    24 }
    25 int main()
    26 {
    27 int i,j,ans;
    28 while(scanf("%d%d",&n,&m)&&n)
    29 {
    30 for(i=0; i<n; i++)
    31 {
    32 for(j=0; j<n; j++) scanf("%d",&out[i][j]);
    33 }
    34 for(i=1; i<=m; i++)
    35 {
    36 for(j=0; j<n; j++) scanf("%d",&in[i][j]);
    37 }
    38 ans=f(m,0);
    39 for(i=1; i<n; i++)
    40 {
    41 ans=MAX(ans,f(m,i));
    42 }
    43 printf("%d\n",ans);
    44 memset(vis,0,sizeof(vis));
    45 }
    46 return 0;
    47 }
  • 相关阅读:
    跨数据库操作
    Windows 服务
    Linq To DataTable
    嵌入式软件应用程序开发框架浅见
    31.获取当前系统时间
    30 System类
    29. StringBuilder
    28. string类中方法练习
    27 string类中常用的方法列表
    26.String类(1)
  • 原文地址:https://www.cnblogs.com/algorithms/p/2431494.html
Copyright © 2011-2022 走看看