BUPT 202 Chocolate Machine 动态规划

2011年的北邮多校联合赛H题

BUPT 202 chocolate mashine

学校的老OJ要挂代理才能上 所以这里给一个hust上的题目链接:

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70168#problem/J

均从1开始计数

dp[i][j]表示以第i行第j列小格为巧克力最右下角时 金钱的最大值

视值小于K的小格为“阻挡”

若(i, j)本身为“阻挡” 则dp[i][j] = 0

若(i, j)的上面一格和左边一格均有“阻挡” 则dp[i][j] = a[i][j]

若仅上面一格为“阻挡” 则 dp[i][j] = 从当前格开始往左边加 直到遇到边界或“阻挡”

若仅左边一格为“阻挡” 则 dp[i][j] = 从当前格开始往上面加 直到遇到边界或“阻挡”

若上和左均无阻挡  则dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + a[i][j]

然后不断更新dp[i][j]中的最大值

不难 就是按我这个思路走的话比较繁琐 wa了4炮TAT

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stack>
#include <set>
#include <queue>
#include <vector>

using namespace std;

typedef long long ll;

const int maxn = 3010;

ll dp[maxn][maxn];
int a[maxn][maxn];

int main()
{
    //freopen("in.txt", "r", stdin);

    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, m, k;
        scanf("%d%d%d", &n, &m, &k);

        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
                scanf("%d", &a[i][j]);

        ll ans = 0;

        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
            {
                if(a[i][j] < k)
                    dp[i][j] = 0;
                else
                {
                    if(dp[i-1][j] == 0 && dp[i][j-1] == 0)
                        dp[i][j] = a[i][j];
                    else if(i-1 >= 1 && dp[i-1][j] == 0)
                    {
                        dp[i][j] = a[i][j];
                        int t = 1;
                        while(j - t >= 1 && dp[i][j-t] != 0)
                        {
                            dp[i][j] += a[i][j-t];
                            t++;
                        }
                    }
                    else if(j - 1 >= 1 && dp[i][j-1] == 0)
                    {
                        dp[i][j] = a[i][j];
                        int t = 1;
                        while(i - t >= 1 && dp[i-t][j] != 0)
                        {
                            dp[i][j] += a[i-t][j];
                            t++;
                        }
                    }
                    else
                    {
                        dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + a[i][j];
                    }
                }

                if(dp[i][j] > ans)
                    ans = dp[i][j];
            }

        printf("%I64d\n", ans);
    }

    return 0;
}
时间: 2024-10-28 08:30:44

BUPT 202 Chocolate Machine 动态规划的相关文章

PatentTips - Virtual machine management using processor state information

BACKGROUND OF THE INVENTION The invention generally relates to virtual machine management, and more particularly to efficient scheduling of virtual machines using processor state information. Virtualization of machine resources has been of significan

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

NOJ 1163 活动安排问题 [动态规划]

活动安排问题 时间限制(普通/Java) : 3000 MS/ 9000 MS 运行内存限制 : 65536 KByte总提交 : 202            测试通过 : 55 比赛描述 设有n个活动的集合E={1,2,--,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi.如果选择了活动i,则它在时间区间[si,fi]内占用资源.若区间[si,fi]与区间[sj,fj

[ACM] hdu 1260 Tickets (动态规划)

Tickets Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 4   Accepted Submission(s) : 2 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Jesus, what a great movie! Thou

Brief History of Machine Learning

Brief History of Machine Learning My subjective ML timeline Since the initial standpoint of science, technology and AI, scientists following Blaise Pascal and Von Leibniz ponder about a machine that is intellectually capable as much as humans. Famous

状态压缩动态规划总结

状态压缩是一个很广的概念,在OI中也有很多的应用,当我们把他应用到动态规划中,可以用来精简状态,节约空间,也方便转移.最常见的就是用二进制来表是状态,利用各种位移运算,就可以实现\(O(1)\)的转移.状压DP适用于“窄棋盘”上的DP,否则状态太多无法存下. POJ1185 炮兵阵地 题意:给一个\(N \times M\)的地形盘,有平原和山坡,要求在平原上部署尽量多的炮(攻击范围2),使得不互相攻击. 数据范围:N <= 100:M <= 10,符合条件.如何表示状态?按行DP,一个二进制

支持向量机(SVM:support vector machine)

传统机器学习分类任务中,我认为支持向量机是最难.最复杂.最有效的一种模型.可能是由于其是一种特殊的神经网络的缘故吧! 1.支持向量机简介 支持向量机(support vector machines,SVM)是一种二类分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机:支持向量机还包括核技巧,这使它成为实质上的非线性分类器.支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划(convex quadratic programming,不怕,附录有解

hdu----(4301)Divide Chocolate(状态打表)

多校综合排名前25名的学校请发送邮件到[email protected],告知转账信息(支付宝或者卡号) Divide Chocolate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 827 Problem Description It is well known tha

poj_1390 动态规划

题目大意 将一些连续的序列根据颜色分为N段,每段有颜色 为 Ci, 长度为 Li.每次点击其中的一段 i ,则可以将该段i消除,该段相邻的两段自动连接到一起,如果连接到一起的两段之前的颜色相同,则更新该段的长度.消除过程可以得到得分 Li*Li.求当所有的段都消除完毕时的最多得分. 分析 求最优化问题,典型的动态规划. (1)考虑前n个段被消除最大得分,求dp[n]?     显然不行,因为无法保证无后效性,因为这种递推从前向后,如果先消除了前i个段,则前i个段中可能和后面的段合并后再消除的情况