接着自己突然有了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算法的理解又深入了一步..