不知道有没有漏看一些讯息,用程式码表示我粗浅的想法。
int map[M][M]={0}; //盘面
int table[N+1][M][M]={0}; //DP表格
//设定初始盘面
map[0][0]=40;
map[0][1]=30;
/*
.
.
.
*/
//设定第一天的各种可能情况
for(int i=-1;i<=1;++i)
{
for(int j=-1;j<=1;++j)
{
table[1][M/2+i][M/2+j]=map[M/2+i][M/2+j];
}
}
//开始填表
for(int i=2;i<=N;++i)
{
for(int j=0;j<M;++j)
{
for(int k=0;k<M;++k)
{
table[i][j][k]=findMax(map,table,i,j,k);
}
}
}
int findMax(int map[M][],int table[N+1][M][],int i,int j,int k)
{
//填空
//需处理边界问题
//需处理当天不能走到的点,在此范例假设table值为0代表无法走到,当天不能走到的
点为table值前一天相邻点皆为0的点。
return max;
}
※ 引述《DJWS (...)》之铭言:
: ※ 引述《jakeasa123 (啊斑斑)》之铭言:
: : 先前在Python板发了篇文,也获得了一些提示,但看了好几天也试做了几个版本,还是没能达到目标,于是来此询问。
: : Python板原文:https://www.ptt.cc/bbs/Python/M.1480482142.A.713.html
: 1. 养不教,父之过。教不严,师之惰。
: 不必同情老师和同学。他们都有问题。
: 2. 原文的推文都在状况外。
: 3. 你的问题可以粗略分成程式问题、算法问题。
: 4. 程式问题就是语文问题,另含一点点数学问题。
: 程式语言变化少,只有for if array recursion,通常都有前例可循,其实不难。
: 由于你没有提供程式码,这里假设你没有程式方面的问题。
: 5. 算法问题就是数学问题。
: 数学问题最困难的地方,就是变化太多、往往没有前例可循。
: 比方说,在几何图形上画一条补助线,问题豁然开朗,根本莫名其妙。
: 即便背熟算法课本,遇到新的算法问题,通常还是解不开,不必自责。
:
: 6. 这一题的特色是:
: (1) 分阶段:分成一天一天,每天做一件事。
: (2) 有因果:今天的位置,决定了明天的位置(在九宫格内)。
: (3) 可累积:今天的收益,以后列入总收益。
: 通常这种题型,可以用dynamic programming解决。
: 盘面拷贝数份,叠起来,变成三维。
: 一天换一个盘面,往上方走去。
: 程式码有:一个二维阵列(盘面),两个二维阵列(dp表格),四层循环(填表格)
: 7. 为什么我会知道那些特色呢?
: 书读多了、问题看多了,依照经验归纳出来的。
: 这些特色在不同地方有不同称呼:
: 例如算法课本里面的词汇是“optimal substructure”
: 例如竞赛选手所用的词汇是“无后效性”“状态转移”
: 那些特色已经形成了SOP了吗?
: 就我所知没有。只能自己看着办。
: . 为什么我能联想到dp呢?
: 因为我曾经遇过类似题目,运气好。
: 8. 数学问题不只一种解法,这个问题也不只一种解法。
: 如果你想掌握各种解法:
: (1) 靠别人:找一个懂的人,跟他交朋友。往后若有需要,靠交情、花钱请他帮忙。
: (2) 靠自己:读懂各类算法课程、书籍、论文,情况许可就再念个phd。
: 9. 获得了“掌握各种解法”的实力之后,有什么用呢?
: 我看过的有:为兴趣、为面试、为逞英雄、为练脑力、为消遣。
: 每个人状况不一样,我没有办法评论。
: 10. 你们老师同学,也许都想到了这个份上。
: 可能他们已经获得了“掌握各种解法”的实力。
: 可能他们不想获得这种实力,因为没用处、因为关注其他实力、因为太弱、...。
: 因此他们各方评估后,决定简单教、随便学就好。
: 与其说他们都有问题,不如说他们都有心思。