好像这个算法看看就没啥好说了,具体输入数据与获取结果分开处理可以这样
~
程序代码:
当然还可以从第k个元素开始回溯遍历~大意就是说从k开始遍历回来,如果遍历结果小于当前MAX则返回前一个元素,这个明显适合用dfs实现,这样在有解的情况下跳过遍历的元素可以尽可能多
~
~
程序代码:
#include<stdio.h>
unsigned fun( const size_t [],size_t );
int main( void )
{
#define __ARR_LEN( s ) \
(sizeof (s)/sizeof (*s))
const size_t a[][5]=
{
{2,3,1,1,4},
{3,2,1,0,4},
{3,3,1,0,4},
{3,0,0,0,4}
};
size_t i;
for (i=0;i!=__ARR_LEN(a);++i)
printf("%u\n",fun(a[i],__ARR_LEN(*a)));
return 0;
#undef __ARR_LEN
}
unsigned fun( const size_t a[],size_t len )
{
size_t i;
size_t k;
for (i=k=0;i!=len;++i)
{
if (k<i+a[i]&&k>=i)
k=i+a[i];
else if (k<i)
return 0;
if (i+a[i]>=len-1)
return 1;
}
return 0;
}
当然还可以从第k个元素开始回溯遍历~大意就是说从k开始遍历回来,如果遍历结果小于当前MAX则返回前一个元素,这个明显适合用dfs实现,这样在有解的情况下跳过遍历的元素可以尽可能多
~[此贴子已经被作者于2018-4-11 17:28编辑过]

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]








