暑假训练赛第六场

暑假训练赛第六场

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

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;
}

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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