暑假训练赛第六场

暑假训练赛第六场

前天因为搞一个数码产品的线下体验就没去,今天算是补题吧。。。

hdoj 2084 数塔

Problem Description
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

已经告诉你了,这是个DP的题目,你能AC吗?
暑假训练赛第六场

Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。

 

Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。

 

Sample Input
1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5

 

Sample Output
30

 
此题从下往上推较为简单,递推公式:dp[i][j]=max(dp[i+1][j],dp[i+1][j+1]);
代码如下:
 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[110][110];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        int i,j;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            for(j=0;j<=i;j++)
            scanf("%d",&dp[i][j]);
        }
        for(i=n-2;i>=0;i--)
        {
            for(j=0;j<=i;j++)
            {
                dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
            }
        }
        printf("%d\n",dp[0][0]);
    }
}

 

UVA11624 Fire!

乔在迷宫中工作。不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划。请帮助乔逃离迷宫。根据乔在迷宫中的位置以及迷宫的哪个方块着火,你必须确定火焰烧到他之前,乔是否可以离开迷宫,如果能离开他能跑多快。
乔和火每分钟移动一个方格,上、下、左、右,四个方向中的一个。火势向四个方向同时蔓延。乔可以从迷宫的任何一个边界逃离迷宫。无论是乔还是火都不会到达有墙的位置。

输入

第一行输入包含一个整数,即测试次数
每个测试用例的第一行包含两个
整数R和C,用空格分隔,1≤R,C≤1000
下面R行中,每一行都包含C个字符,以及每个字符是以下之一:
# 代表墙
. 代表空地,火和乔是可通行的
J 乔在迷宫中最初的位置,火和乔是可通行的
F 代表火
在每组测试中只有一个J

输出

对于每个测试用例,如果在火蔓延的时候烧到了乔,则乔无法逃出迷宫,输出'IMPOSSIBLE'如果乔能逃出迷宫,则输出乔最快可以在几分钟内安全逃出迷宫,每组输出占一行

样例输入

2
4 4
####
#JF#
#..#
#..#
3 3
###
#J.
#.F

样例输出

3
IMPOSSIBLE

以下是两种方法,自己稍微能理解的风格。

关键是之后应该怎样处理火势的蔓延与Joe逃跑这两个过程的关系,我们要清楚:只有火势可以影响Joe的逃跑路线,但Joe的逃跑路线绝对不能影响火势,所以这两个过程不可能出现在同一个BFS中。

可以这样想:既然火势的蔓延时不随人的主观意愿而改变的,那么我们可以先让火势肆意蔓延,看它到底能烧到哪里,以及烧到某个地方所需要的时间,这样,主人公在逃跑的过程中,只要在火势到达之前赶到某个地方就可以了。

综上,需要两个BFS,第一个计算火势蔓延到任意一点所需要的时间,如果火势永远到达不了某些点,就把这些点的时间设为正无穷,之后再搜索Joe的逃跑路线,条件要增加时间这一项,只要Joe能到达迷宫的边界,就算逃出来了。
 


//两个队列

 

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
bool vis1[1005][1005];
char Map[1005][1005];
const int d[4][2]={
  {-1,0},{0,1},{1,0},{0,-1}};
int r,c;
typedef struct qnode
{
    int x,y,s;
    qnode(int xx=0,int yy=0,int ss=0):x(xx),y(yy),s(ss){}
}qnode;

bool ok(int x,int y)
{
    return x>=0&&x<r&&y>=0&&y<c&&Map[x][y]!='#';
}
queue<qnode> f;
void BFS(qnode pst)
{

    queue<qnode> p;
    int u,v;
    p.push(pst);
    vis1[pst.x][pst.y]=true;
    while(1)
    {

        if(!f.empty())
        {
            qnode t=f.front();
            qnode q=t;
            while(t.s==q.s)
            {
                for(int i=0;i<4;++i)
                {
                    u=t.x+d[i][0],v=t.y+d[i][1];
                    if(ok(u,v)&&!vis1[u][v])
                    {
                        vis1[u][v]=true;
                        f.push(qnode(u,v,t.s+1));
                    }
                }
                if(!f.empty()) {f.pop(),t=f.front();}
            }
        }
        if(!p.empty())
        {
            qnode t=p.front();
            qnode q=t;
            while(t.s==q.s)
            {
                for(int i=0;i<4;++i)
                {
                    u=t.x+d[i][0],v=t.y+d[i][1];
                    if(u==-1||u==r||v==-1||v==c)
                        {
                            cout<<t.s<<endl;
                            return;
                        }
                    if(ok(u,v)&&!vis1[u][v])
                    {
                        vis1[u][v]=true;
                        p.push(qnode(u,v,t.s+1));
                    }
                }
                if(!p.empty()) {p.pop(),t=p.front();}
            }
        }
        else
        {
            cout<<"IMPOSSIBLE"<<endl;
            return;
        }
    }

}
int main()
{
    int t;
    int w;
    cin>>t;
    w=0;
    while(t--)
    {
        qnode a,b;
        cin>>r>>c;
        memset(vis1,0,sizeof(vis1));
        memset(Map,0,sizeof(Map));
        while(!f.empty()) f.pop();
        for(int i=0;i<r;++i)
        {
            cin>>Map[i];
            for(int j=0;j<c;++j)
            {
                if(Map[i][j]=='J') {a.x=i,a.y=j,a.s=1;}
                else if(Map[i][j]=='F')
                {
                    b.x=i,b.y=j,b.s=1;
                    f.push(b);
                    vis1[i][j]=true;
                }
            }
        }
        BFS(a);
    }
    return 0;
}

//一个队列

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
bool vis1[1005][1005];
char Map[1005][1005];
const int d[4][2]={
  {-1,0},{0,1},{1,0},{0,-1}};
int r,c;
typedef struct qnode
{
    int x,y,s,r;
    qnode(int xx=0,int yy=0,int ss=0,int rr=0):x(xx),y(yy),s(ss),r(rr){}
}qnode;
bool ok(int x,int y)
{
    return x>=0&&x<r&&y>=0&&y<c&&Map[x][y]!='#';
}
queue<qnode> f;
void BFS(qnode pst)
{
    qnode t;
    int u,v;
    f.push(pst);
    vis1[pst.x][pst.y]=true;
    while(!f.empty())
    {
        t=f.front(),f.pop();
        for(int i=0;i<4;++i)
        {
            u=t.x+d[i][0],v=t.y+d[i][1];
            if(t.r&&(u==-1||u==r||v==-1||v==c))
            {
                cout<<t.s+1<<endl;
                return;
            }
            if(ok(u,v)&&!vis1[u][v])
            {
                vis1[u][v]=true;
                f.push(qnode(u,v,t.s+1,t.r));
            }
        }
    }
    cout<<"IMPOSSIBLE"<<endl;
    return;
}
int main()
{
    qnode a,b;
    int t;
    cin>>t;
    int w=0;
    while(t--)
    {
        cin>>r>>c;
        memset(vis1,false,sizeof(vis1));
        memset(Map,0,sizeof(Map));
        while(!f.empty()) f.pop();
        for(int i=0;i<r;++i)
        {
            cin>>Map[i];
            for(int j=0;j<c;++j)
            {
                if(Map[i][j]=='J') a.x=i,a.y=j,a.s=0,a.r=1;
                else if(Map[i][j]=='F')
                {
                    b.x=i,b.y=j,b.s=0,b.r=0;
                    vis1[i][j]=true;
                    f.push(b);
                }
            }
        }
        BFS(a);
    }
    return 0;
}

N!再一次

问题描述
泽蒂,你在干什么?
我要算N!.
从何而来:太简单了!N有多大?
Zty:1<=N<=1000000000000000000000000000000000000000000000…
来自何方:哦!你一定疯了!你是法绍吗?
泽蒂:不。我已经说完我的话了。我只是说我想计算N!国防部2009

提示:0!=1,N!=N*(N-1)!
 
输入
每一行将包含一个整数N(0<=N<=10^9)。进程到文件结束。
 
输出量
对于每一种情况,输出N!国防部2009
 
样本输入
4 5
 
样本输出
24 120
对2009取余,同余定理(a*b)%c=(a%c)*(b%c)%c;(只能拿小本本记一下了)

下面这个代码是见到最简洁的
 

#include<stdio.h>
int main()
{
	int n,ans,i;
	while(scanf("%d",&n)==1)
	{
		ans=1;
		if(n<44)
		{
			for(i=1;i<=n;++i)
			{
				ans=(ans*(i%2009))%2009;
			}
		}
		else ans=0;
		printf("%d\n",ans);
	}
	return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114894.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sublime text3入门教程「建议收藏」

    sublime text3入门教程「建议收藏」作者:sam976转载需征得作者本人同意,谢谢。所谓工欲善其事必先利其器,编码过程合理熟练使用工具是优秀程序员必备技能,在诸多工具中,SublimeText无疑是一款利器,它界面优美、功能强悍、性能令人惊讶…

    2022年7月11日
    16
  • 【CenterNet】模型文件resnet101-5d3b4d8f.pth下载[通俗易懂]

    【CenterNet】模型文件resnet101-5d3b4d8f.pth下载[通俗易懂]常用到的模型和预训练参数:ctdet_coco_hg.pthctdet_coco_dla_2x.pthctdet_coco_resdcn101.pthctdet_coco_resdcn18.pthmulti_pose_dla_3x.pthdla34-ba72cf86.pthresnet101-5d3b4d8f.pthresnet18-5c106cde.pth点击模型tr6e…

    2022年9月1日
    0
  • 有赞和腾讯云、阿里云一同摘得“中国企业云科技服务商50强”[通俗易懂]

    有赞和腾讯云、阿里云一同摘得“中国企业云科技服务商50强”[通俗易懂]互联网时代的每一次技术变革都带来新的机会,而云计算这一诞生于2006年的新技术正在引领新的科技浪潮。正是从2006年开始,众多云计算公司借助云计算的东风,成长为数十亿、上百亿甚至超千亿美元市值的科技公司。亚马逊就是在2006年转向云计算之后,用十年时间成长为一家万亿美元市值的公司。在亚马逊之后,Salesforce也稳稳站上了千亿美元市值。而ServiceNow、Workday、Veeva、Shopify则在向500亿美元关口冲刺。紧随其后的是大量数十亿美元市值的云计算公司,它们分布在企业服务的…

    2022年6月15日
    48
  • Java集合篇:List总结

    Java集合篇:List总结

    2021年10月4日
    39
  • git已经提交的文件回复忽略「建议收藏」

    git已经提交的文件回复忽略「建议收藏」将文件加入到忽略文件中使用命令,已提交的文件如何恢复忽略git rm –cached 文件git rm –cached -r 文件夹git rm –cached .push到远程

    2022年8月8日
    0
  • connect A with B_anyconnect怎么用

    connect A with B_anyconnect怎么用解决git下载出现:Failedtoconnectto127.0.0.1port1080:Connectionrefused拒绝连接错误(20190226)文章目录:一、git拒绝连接原因分析二、错误解决方式1、查看Linux当前有没有使用代理2、查看端口有没有被占用2、取消代理设置linux解决端口号被占用(扩展内容)不知道是不是翻墙导致的错误,昨天同事说服务器出现了这个错误……

    2022年9月7日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号