zoukankan      html  css  js  c++  java
  • HDU 5074:Hatsune Miku(2014 Asia AnShan Regional Contest)

    Hatsune Miku

    题目链接:

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

    题意:

    给出n和m,然后输入一个由m*m的矩阵a,再输入n个数字b,-1代表这个数字可以变成1~m中的任何一个,求a[b[1]][b[2]]+a[b[2]][b[3]]+...+a[b[n-1]][b[n]]的最大值

    题解:

    设dp[i][j]为数组b取前 i 个元素且第 i 个元素是 j 时可以得到的最大值,水之

                  

    代码

    include<stdio.h>
    #include<math.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    const int N=51;
    int mmax(int x,int y)
    {
    	return x>y?x:y;
    }
    int a[N][N],dp[101][N],s[101];
    void solve()
    {
    	int T,n,m,res;
    	scanf("%d",&T);
    	while(T--)
    	{
    		memset(dp,-1,sizeof(dp));
    		scanf("%d%d",&n,&m);
    		for(int i=1;i<=m;++i)
    		for(int j=1;j<=m;++j)
    		scanf("%d",&a[i][j]);
    		for(int i=1;i<=n;++i)
    		scanf("%d",&s[i]);
    		for(int i=1;i<=n;++i)
    		if(s[i]==-1)
    		for(int j=1;j<=m;++j)
    		{
    			dp[i][j]=0;
    			for(int k=1;k<=m;++k)
    			if(dp[i-1][k]!=-1)
    			dp[i][j]=mmax(dp[i][j],dp[i-1][k]+a[k][j]);
    		}
    		else
    		{
    			dp[i][s[i]]=0;
    			for(int j=1;j<=m;++j)
    			if(dp[i-1][j]!=-1)
    			dp[i][s[i]]=mmax(dp[i][s[i]],dp[i-1][j]+a[j][s[i]]);
    		}
    		res=-1;
    		for(int i=1;i<=m;++i)
    		if(dp[n][i]>res)res=dp[n][i];
    		printf("%d
    ",res);
    	}
    }
    int main()
    {
    	solve();
    	return 0;
    }
  • 相关阅读:
    4815 江哥的dp题a
    CON1023 明明的计划
    5200 fqy的难题----2的疯狂幂
    [SCOI2005] 最大子矩阵
    1457 又是求和?
    2064 最小平方数
    vijos P1459车展
    1366 xth 的第 12 枚硬币
    1360 xth 的玫瑰花
    3223: Tyvj 1729 文艺平衡树
  • 原文地址:https://www.cnblogs.com/kiuhghcsc/p/5826407.html
Copyright © 2011-2022 走看看