题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1876

题意:问机器人到达终点的过程中最多有几次完全消耗完能量,消耗完这么多次能量的方式有几种。

分析:模拟一下可知,每次走到下一次消耗完时必定在一条对角线上。

以sample为例:

由于整个过程是以对角线的方向递推下去的,每次必定是往右下方走的,所以只需按着正常循环递推即可,当然按对角线右下方循环也可,不过那样略微麻烦。dp[i][j].num表示走到点(i,j)时消最多次耗完能量的次数,dp[i][j].cnt表示走到点(i,j)时消最多次耗完能量的方式。

状态转移方程为:

if(dp[x][y].num<dp[i][j].num+1)
                    {
                        dp[x][y].num=dp[i][j].num+1;
                        dp[x][y].cnt=dp[i][j].cnt;
                    }
                    else if(dp[x][y].num==dp[i][j].num+1)
                        dp[x][y].cnt+=dp[i][j].cnt;

本题还有好几个坑,能量为0的格子不能走,在终点时就不用递推了,样例没有刚好在终点时消耗完能量,所以这里被坑得好惨T^^T

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 10010
using namespace std;
struct node
{
int cnt,num;
} dp[][];
int flag[][],a[][];
int main()
{
int t,n,m,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)scanf("%d",&a[i][j]);
memset(flag,,sizeof(flag));
memset(dp,,sizeof(dp));
flag[][]=;
dp[][].cnt=;
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
{
if(i==n&&j==m)continue;//这里尤为注意
if(flag[i][j])
{
if(!a[i][j])continue;//能量为0时不能走
x=i+a[i][j];
y=j;
int t=a[i][j]+;
if(x+y<=m+n)
{
while(t--)
{
if(x>n||y>m||x<=||y<=)//不在方格内不算
{
x--;
y++;
continue;
}
flag[x][y]=;
if(dp[x][y].num<dp[i][j].num+)//取次数多的
{
dp[x][y].num=dp[i][j].num+;
dp[x][y].cnt=dp[i][j].cnt;
}
else if(dp[x][y].num==dp[i][j].num+)
dp[x][y].cnt+=dp[i][j].cnt;
x--;
y++;
}
}
else//走到终点没消耗完能量的
{
if(dp[n][m].num<dp[i][j].num)
{
dp[n][m].num=dp[i][j].num;
dp[n][m].cnt=dp[i][j].cnt;
}
else if(dp[n][m].num==dp[i][j].num)
dp[n][m].cnt+=dp[i][j].cnt;
}
}
}
printf("%d %d\n",dp[n][m].num,dp[n][m].cnt);
}
}

hdu1876(dp)的更多相关文章

  1. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  3. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  4. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  5. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  6. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  7. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  8. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  9. 最长公共子序列长度(dp)

    /// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...

随机推荐

  1. vc怎么去掉烦人的“驱动器未准备好”错误

    在我们写程序的时候,如果访问一个软驱中没有软盘或者光驱中没有cd的时候,windows总是弹出一个恼人的错误框说“驱动器未准备好” 其实我们可以通过如下的步骤禁止这个错误框的弹出 一.用SetErro ...

  2. MySQL生成-单据号不重复

    需求生成一个单据编号 单据编号结构: “单据类型” + “日期” + “流水号” 例子 : GD201605230000007 代码: DELIMITER $$ CREATE PROCEDURE `y ...

  3. How to retreive raw post data from HttpServletRequest in java

    public static String getPostData(HttpServletRequest req) { StringBuilder sb = new StringBuilder(); t ...

  4. res/drawable目录

    在Android Eclipse项目中res/目录下包含有drawable-ldpi/,drawable-mdpi/,drawable-hdpi/,drawable-xhdpi/目录,这几个目录的后缀 ...

  5. Swift - 使用TableView的静态单元格进行页面布局

    通过使用静态单元格的列表,我们可以很方便的进行页面布局.下面通过一个“添加任务页面”来进行演示. 效果图如下: 实现步骤: 1,在storyboard中拖入一个TableViewController, ...

  6. 安装ipvsadm报错

    server环境: [vagrant@localhost download]$ uname -a Linux RS1 2.6.18-238.el5 #1 SMP Thu Jan 13 15:51:15 ...

  7. 《Swift编程语言》中文翻译及读书笔记page25

    The Swift Programming Language读书笔记学习笔记 第25页 本页主要说在swift语言里能够使用分号,但分号不作为每条swift语言语句的结尾 而是间隔写在一行的多条swi ...

  8. 改变TPageControl的活动标签颜色

    设置PageControl的owndraw属性为TRUE. procedure TForm1.pgc1DrawTab(Control: TCustomTabControl; TabIndex: Int ...

  9. hdu 4712 Hamming Distance bfs

    我的做法,多次宽搜,因为后面的搜索扩展的节点会比较少,所以复杂度还是不需要太悲观的,然后加上一开始对答案的估计,用估计值来剪枝,就可以ac了. #include <iostream> #i ...

  10. 通过OpenSSL解码X509证书文件

    在Windows平台下.假设要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI. 可是在非Windows平台下,就仅仅能使用强大的开源跨平台库OpenSSL了.一个X509证书通过 ...