hdu1876续

接着自己突然有了dp的灵感,当然中间出了很多次问题,考虑并不是很全面,最后得到最终的版本,每一个状态用一个结构记录来表示,遗憾的是依旧不能AC

 

//这种问题肯定用dp更高效,可一直顾虑次数怎么记录,dp典型特征是无后效性,不记录到达该状态的路径(其实完全可以实现)
//其实忽略了很重要的一点,其实我们只需要一个步骤数目,这就是状态迁移时用到的参数而并不是整个路径
#include <iostream>
#include <fstream>
using namespace std;
int map[103][103];

struct rec
{
 int num;
 int count;
};
rec state[103][103];


int main()
{
 //ifstream fin("hdu1876");
 int t;
 cin>>t;
 //fin>>t;
 int n,m;
 while(t--)
 {
  cin>>n>>m;
  //fin>>n>>m;
  int i,j;
  for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
   {
    cin>>map[i][j];
    state[i][j].num=state[i][j].count=0;
    //fin>>map[i][j];
    //state[i][j]=0;
   }

  for(i=n;i>0;i--)
   for(j=m;j>0;j--)
   {
    int value=map[i][j];
    for(int x=i;x<=i+value&&x<=n;x++)
    {
     int y=i+j+value-x;
     if(y<=m)
     {
      if(state[i][j].num<state[x][y].num+1)
      {
       if(x==n&&y==m)continue;    //终点耗完不统计
       state[i][j].num=state[x][y].num+1;
       if(state[x][y].count)state[i][j].count=state[x][y].count;//或许可以考虑在初始化时把可以一步到达终点的点count设为初值1
       else state[i][j].count=1;
      }
      else if(state[i][j].num==state[x][y].num+1)
      {
       if(x==n&&y==m)continue;    //终点耗完不统计
       if(state[x][y].count)state[i][j].count+=state[x][y].count;
       else state[i][j].count++;
      }
     }
    }
   }

      cout<<state[1][1].num<<" "<<state[1][1].count<<endl;   
 }
 return 0;
}

 

 

终于发现问题了,其实我一直使用直接走value步定位到可能到达的位置,而忽略了这个过程中变化的次数,暂时不实现了,题目有点不清不楚的,其实这种可能性也不大,不然测试用例中的数据中次数不可能那么小,还是觉得获得能量的位置数统计更为合理,这里就先搁笔了,折磨了一下午还是没能解决,但至少对搜索算法 dp算法的理解又深入了一步..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值