hdu1978

来源:互联网 发布:淘宝多少流量成交一单 编辑:程序博客网 时间:2024/05/16 01:11

其实严格来说这道题的描述是有问题的

这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m)。游戏的规则描述如下:

1.机器人一开始在棋盘的起始点并有起始点所标有的能量。
2.机器人只能向右或者向下走,并且每走一步消耗一单位能量。
3.机器人不能在原地停留。

4.当机器人选择了一条可行路径后,当他走到这条路径的终点时,他将只有终点所标记的能量。

注意点4我们看到只有在终点的时候才会有标记的能量,也就是说刚开始的时候的能量没有用完的时候他是不会拥有能量的,所以他经过的中间的地方是不会有能量值的转换的也就不需要考虑了,但是题目正确的答案是考虑之后的,也就是说在他所到之处他想要交换能量值都是可以的,这样算来我们会有多少种方法?这样一来就简单了,因为每个地方都是可以走的,我们在还要算出他第一步到的所有地方和从这次些地方出发所到的地方那么这时候我们就是可以直接暴力。

#include<iostream>
using namespace std;
#include<cstdlib>
int main()
{
int N,m,n;
int i,j,k;
int dp[103][103],f[103][103];
cin>>N;
while(N--)
{
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&f[i][j]);
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=0;i<n;i++)          //从第一个开始一直往后走。
for(j=0;j<m;j++)
{
                k=f[i][j];

for(int t1=0;t1<=k&&t1+i<n;t1++)             //这里是表示在拥有能量值为k时,横向所能走的所有的值

for(int t2=0;t2+t1<=k&&t2+j<m;t2++)    //这里是表示拥有能量值为k时,横向已走i格那么纵向所能走的所有的值

{
if(t1==0&&t2==0)continue;
dp[i+t1][j+t2]=(dp[i+t1][j+t2]+dp[i][j])%10000;//同时会有从两个地方来的东西最后到达同一个地方,所以我们现在还要加上dp[i+t1][j+t2],本来就是
//对于每一个i对应着f[i][j]=i或者m-i个j这个时候就很好的瞒满足了所有的情况。
}
}
cout<<dp[n-1][m-1]<<endl;
}
return 0;

}



如果是只能拥有最后的点能量,就是说他只能停留在每一次的终点,而中间的是不算的话,这个时候就比较麻烦。这里不重点讲,不过贴一个代码:

#include<iostream>
using namespace std;
#include<cstdlib>
const int Max=105;
int a[Max][Max],b[Max][Max],c[Max][Max],d[Max][Max];
int f[Max][Max],p[Max];
int main()
{
int m,n;
int i,j,k,t;
int N;
int num;
cin>>N;
while(N--)
{
scanf("%d%d",&n,&m);
num=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
         if(a[n-1][m-2]>0)
c[n-1][m-2]=1;
if(a[n-2][m-1]>0)
c[n-2][m-1]=1;
     b[n-1][m-1]=1;
for(i=n-1;i>=0;i--)
{
for(j=m-1;j>=0;j--)
{
if((i!=n-1)||(j!=m-1))
b[i][j]+=b[i+1][j]+b[i][j+1];
d[i][j]=b[i][j];
f[n-1-i][m-j-1]=b[i][j];
cout<<f[n-1-i][m-j-1]<<" ";
}
}
for(i=n-1;i>=0;i--)
for(j=m-1;j>=0;j--)
{
num=0;
t=0;
memset(p,0,sizeof(p));
if((n-1-i+m-1-j)<=a[i][j])
{
num=b[i][j];
c[i][j]=1;
}
for(k=0;k<=a[i][j]&&(k+i)<m;k++)
if(c[i+k][j+a[i][j]-k]==1)
{
p[t]+=f[k][a[i][j]-k];
p[t++]*=d[i+k][j+a[i][j]-k];
c[i][j]=1;
}
  if(t!=0)
  {
d[i][j]=0;
for(k=0;k<t;k++)
{
d[i][j]+=p[k];
d[i][j]+=num;
}
  }
}
cou<<d[0][0]<<endl;
}
return 0;
}

0 0
原创粉丝点击