前天因为搞一个数码产品的线下体验就没去,今天算是补题吧。。。
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账号...