HDU 5234 Happy birthday 动态规划(三维数组)

题目大意:过生日,有一个N*M的表格,每个位置都有一块一定重量的蛋糕你可以选择吃完或者不吃,从(1,1)走到(n,m),每次只能向右走或向下走,最多能吃k重量的蛋糕。问你最多能吃多少蛋糕。

题目思路:之前的01背包我们都是用一维数组v[]来储存的,但这次要用二维数组Map[i][j]储存一个点的价值,当前点由Map[i][j-1]或Map[i-1][j]走到。

状态转移方程式:dp[i][j][q]=max(dp[i][j][q],Map[i][j]+max(dp[i][j-1][q-Map[i][j]],dp[i-1][j][q-Map[i][j]])).

#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 105

using namespace std;

int dp[MAX][MAX][MAX],Map[MAX][MAX];

int main()
{
    int n,m,k,v1,v2,i,j,q;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&Map[i][j]);
            }
        }

        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                for(q=k;q>=Map[i][j];q--)
                {
                    v1=max(dp[i][j-1][q],dp[i-1][j][q]);
                    v2=Map[i][j]+max(dp[i][j-1][q-Map[i][j]],dp[i-1][j][q-Map[i][j]]);
                    dp[i][j][q]=max(v1,v2);
                }
            }
        }

        printf("%d\n",dp[n][m][k]);
    }
    return 0;
}

时间: 2024-12-26 07:29:21

HDU 5234 Happy birthday 动态规划(三维数组)的相关文章

hdu 1864 实数离散化+动态规划+滚动数组

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace st

HDU 5234 Happy birthday --- 三维01背包

HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置(i,j)有一个容量为k的背包所能获得的最大价值 决策:a[i][j]处的数是否选取 不选取: dp[i][j][k]= max(dp[i-1][j][k], dp[i][j-1][k]) 选取:首先要求k >=a[i][j],那么dp[i][j][k] = max(dp[i-1][j][k-w[i

hdu 5030 Rabbit&#39;s String(后缀数组&amp;二分)

Rabbit's String Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 288    Accepted Submission(s): 108 Problem Description Long long ago, there lived a lot of rabbits in the forest. One day, the

*三维数组的初始化及遍历三个for循环

package com.chongrui.test; /* *三维数组的初始化及遍历 * */ public class test { public static void main(String[] args) { int a[][][]=new int[][][]{ {{1,2,3},{4,5,6}}, {{8,9,10},{11,12,13}}, {{14,15,16},{17,18,19,20}}, }; for(int i=0;i<a.length;i++){ System.out.p

HDU 1541 Stars (树状数组)

Problem Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given

[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

JAVA的 一维数组、二维数组、三维数组、多维数组等。

这个数组可以看做新手学习,从一维数组 到 多维 数组 循环渐进,其实看起也很简单,一看便知,众所周知,一维.二维或许经常用到,用到二维以上应该就很少了. public class test { public static void main(String[] args) { /*一维数组*/ int num[] = {0,1,2}; /*下面输出 3 行数据,0 ~ 2*/ for (int i = 0; i < num.length; i++) { System.out.println("

CUDA三维数组

http://hpcbbs.it168.com/forum.php?mod=viewthread&tid=1643 根据上面链接的帖子研究了下三维数组,就像他自己说的一样是有问题的,我自己修改了下,结果终于正确了.大家有兴趣的可以对照着看看. 整个过程关键参考了这篇文章http://www.xuebuyuan.com/685353.html 1 #include <stdio.h> 2 //#include <cutil.h> 3 #include <helper_c

hdu 5030 Rabbit&#39;s String(后缀数组)

题目链接:hdu 5030 Rabbit's String 题目大意:给定k和一个字符串,要求将字符串拆分成k个子串.然后将每个子串中字典序最大的子串选出来,组成一个包含k个字符串的集合,要求这个集合中字典序最大的字符串字典序最小. 解题思路:网赛的时候试图搞了一下这道题,不过水平还是有限啊,后缀数组也是初学,只会切一些水题.赛后看了一下别人的题解,把这题补上了. 首先对整个字符串做后缀数组,除了处理出sa,rank,height数组,还要处理处f数组,f[i]表示说以0~sa[i]开头共有多少