zoukankan      html  css  js  c++  java
  • hdu 5074 Hatsune Miku

    http://acm.hdu.edu.cn/showproblem.php?pid=5074

    题意:给你一个的矩阵score[i][j],然后给你一个数列,数列中有一些是-1,代表这个数可以换成1~m的任意一个数,然后求的最大值。

    思路:二维dp,dp[i][j]代表i位置的数为j的最大和。 通过前面求和推此位置的最大和,分为四中情况,(a,-1)、(a,b)、(-1,-1)、(-1,b); dp[i][j]=max(dp[i][j],dp[i-1][k]+g[k][j]);

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 int t,n,m;
     7 int g[60][60];
     8 int a[110];
     9 int dp[1000][1000];
    10 
    11 int main()
    12 {
    13     scanf("%d",&t);
    14     while(t--)
    15     {
    16         scanf("%d%d",&n,&m);
    17         for(int i=1; i<=m; i++)
    18         {
    19             for(int j=1; j<=m; j++)
    20             {
    21                 scanf("%d",&g[i][j]);
    22             }
    23         }
    24         for(int i=1; i<=n; i++)
    25         {
    26             scanf("%d",&a[i]);
    27         }
    28         memset(dp,0,sizeof(dp));
    29         for(int i=2; i<=n; i++)
    30         {
    31             if(a[i]>0)
    32             {
    33                 if(a[i-1]>0)
    34                 {
    35                     dp[i][a[i]]=dp[i-1][a[i-1]]+g[a[i-1]][a[i]];
    36                 }
    37                 else
    38                 {
    39                     for(int j=1; j<=m; j++)
    40                     {
    41                         dp[i][a[i]]=max(dp[i][a[i]],dp[i-1][j]+g[j][a[i]]);
    42                     }
    43                 }
    44             }
    45             else
    46             {
    47                 for(int j=1; j<=m; j++)
    48                 {
    49                     if(a[i-1]>0)
    50                     {
    51                         dp[i][j]=max(dp[i][j],dp[i-1][a[i-1]]+g[a[i-1]][j]);
    52                     }
    53                     else
    54                     {
    55                         for(int k=1; k<=m; k++)
    56                         {
    57                             dp[i][j]=max(dp[i][j],dp[i-1][k]+g[k][j]);
    58                         }
    59                     }
    60                 }
    61             }
    62         }
    63         int ans=0;
    64         for(int i=1; i<=m; i++) ans=max(ans,dp[n][i]);
    65         printf("%d
    ",ans);
    66     }
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    kickstart自动化安装
    linux双网卡绑定
    作死实验,删除libc.so.6
    安装centos6及安装redhat6后的配置
    交换机、linux光衰查询
    ansible的简单使用
    linux安全配置学习
    vm的三种网络模式
    Recylerview的使用系列教程
    Android自定义组合控件
  • 原文地址:https://www.cnblogs.com/fanminghui/p/4233315.html
Copyright © 2011-2022 走看看