HDU5074 dp xingxing在努力

  这道题就是给你一个序列a, 定义序列的最优美度为d[a[i]][a[i+1]], 现在让sigma(d[a[i]][a[i+1]]) i=1 - n-1最大,当a[i]<0是序列这个位置可以随便选, 否则不能随便选, 则sigma(d[a[i]][a[i+1]]) i=1 - n-1最大是多少?这道题乍一看是搜索, 然而看一下数据范围, 感觉搜索胜任不了, 于是果断想了一种dp的做法,定义dp[i][j]为第i个位置为j时的最大值, 那么答案就可以推出来, 具体见代码:

/*************************************************************************
    > File Name: 1004.cpp
    > Author: xingxing
    > Mail:
    > Created Time: 2015年12月08日 星期二 19时14分21秒
 ************************************************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int f[100+10][55];
int a[55][55];
int num[105];
int n, m;

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &n, &m);
        for(int i=1; i<=m; i++)
            for(int j=1; j<=m; j++)
                scanf("%d", &a[i][j]);
        memset(f, 0, sizeof(f));
        for(int i=1; i<=n; i++)
            scanf("%d", &num[i]);
        for(int i=2; i<=n; i++)
        {
            if(num[i-1] < 0)
            {
                for(int j=1; j<=m; j++)
                     for(int k=1; k<=m; k++)
                        f[i][j] =max(f[i][j], f[i-1][k] + a[k][j]);

            }
            else
            {
                for(int j=1; j<=m; j++)
                    f[i][j] = max(f[i][j], f[i-1][num[i-1]]+a[num[i-1]][j]);
            }
        }
        int res = 0;
        if(num[n] < 0)
            for(int j=1; j<=m; j++)
                res = max(res, f[n][j]);
        else
            res = f[n][num[n]];
        printf("%d\n", res);
    }
    return 0;
}
时间: 2025-01-09 07:09:21

HDU5074 dp xingxing在努力的相关文章

POJ3311 TSP问题 xingxing在努力

这道题可以转化为TSP问题, 预处理各个顶点之间的最短路即可. 其中dp[s][j]表示已经访问过s个顶点, 最后访问的一个城市编号为j,代码如下: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; int n; //顶点0 - n int d[15][15]; void floyd() { for(int

HDU5592 排队问题 xingxing在努力

题意就不多说了, 题可以转化为排队问题, 我们可以使用树状数组来维护,代码如下: #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 50010; int n; int c[maxn]; int lowbit(int x) { return x&(-x); } int sum(int i) { int s = 0; whil

POJ1275 很好地差分约束系统 xingxing在努力

还是花费了几天A这道题的, 蛮好的一道题, 题意是有一家咖啡店在二十四小时内每个小时段都需要一定数目的服务员来提供服务, 有n个应聘者来来这家店(一旦应聘者从第i小时开始工作那么他就要连续的工作八个小时), 现在给定应聘者的数量问你最少需要多少个服务员能满足这家店的需求. 假设r[i]是这家店第i到第i+1小时所需要的服务员的最小数目,t[i]表示第i时刻来应聘的人数, s[i]表示前i个小时段内店铺招的总人数那么就可以得到下面的约束公式: 0=<s[i] - s[i-1]<=t[i]    

HDU5586 最大连续和 xingxing在努力

这道题的意思是给你一串数字, 每一个数字可以通过一个公式转换成其他的数, 你可以转换一个连续区间的数, 让这一串数字的和最大..只需要做一个小小的转换就可以转化问题为最大连续和.   具体见代码, 不过需要注意最大连续和的递推式是d[i] = max(c[i], d[i-1]+c[i])不要弄错了..代码如下: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; c

POJ2184 01背包变形 xingxing在努力

这道题乍一看就有了思路,大体就是定了其中一个值然后再求另外一个值的最大值, 然而代码实现好坑, 题意是奶牛有两个属性 Ai和Bi, 让你求Ai和Bi和的最大值,注意Ai的和不能为负整数, Bi也一样..假设我们定了Ai我们来看下状态方程:f[i][j] = max(f[i-1][j], f[i-1][j-A[i]]+B[i]).当A[i]为正的时候就是我们经常遇到的01背包,使用滚动数组倒着排一遍, 然而当A[i]为负的时候我们就应该从小推到大,这样才对..代码如下: #include <cst

HDU1226 搜索 bfs xingxing在努力

这道题就是给你M个C进制的数, 然后让你求最小的数, 这个数是N的整数倍..搜索即可:剪枝条件:假设有两个数模N都为0那么我们就可以舍弃较大的那个数.为什么可以这样,我们可以假设这两个数是a, b a  = b (mod N)  => a*C + d = b*C + d (mod N), 然后注意取模的时候要用大数取摸的方式..坑点:N可能为0, 对于N==0的时候,我们应该特殊判断, 代码如下: #include <cstdio> #include <cstring> #i

POJ1787 完全背包 xingxing在努力

这道题的意思是给你1 5 10 25 的硬币c1 c2 c3 c4枚, 求出一个方案使硬币个数最多, 且恰好是p..给完全背包加几个状态即可..代码如下: WA点: 可能看完动漫时间有点晚记得把题目终止输入条件判错了 2:used[j-w[i]]<num[i]写错成used[j-w[i]]+1<num[i],罪过罪过: #include <cstdio> #include <cstring> #include <algorithm> using namesp

HDU2955 01背包变体 xingxing在努力

这道题的题意是小偷要去偷N家银行, 每家银行都有一个钱款数额Mi和被抓概率pi, 求小偷被抓的概率小于P的情况下所能偷到的钱数额的最大值(每家银行最多偷一次),由于每家银行最多偷一次, 所以这个题可以用01背包的思想来求解, 又因为小偷被抓会有很多种情况,并不好算,因此我们用他的反面小偷成功逃脱来算?这样题目就成了小偷在成功逃脱的概率大于1-P的情况下所能偷到的钱数最大值..记f[i][j]为小偷在前i家银行恰好偷了j块钱成功逃脱的 概率最大值, 那么f[i][j] = max(f[i-1][j

HDU2639 第k小01背包 xingxing在努力

这个题目是求解第k小01背包, 我们只需要再多加一维表示容量为j时的价值即可..代码里面用了归并排序的思想来求解f[j][k], 代码如下: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int f[1000+10][35]; int A[35], B[35]; //A选 B不选 int W[100+10], V[100+10]; int N, v, K; v