好像这个算法看看就没啥好说了,具体输入数据与获取结果分开处理可以这样~
当然还可以从第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]