雖然題目有標示是 DP, 但是 m的範圍這麼大, 應該不可能是紀錄0~m之間所有的狀態
感覺題目的4和7是有意義但不知道怎麼做?
只有停留在 n 個格子上時才有意義,而不用關注中間的走法。
注意到 4x + 7y = k 在 k 為 >=18 的正整數時 x, y 一定有非負整數解,
也就是說格子 A、B 的座標 (x_A < x_B) 差 18 以上時必能從 A 跳到 B,
而 < 18 的情形不多可以直接枚舉。
謝謝你的熱心回覆, 根據提示想了一下 用Bottom_up方式由後往前更新
但是這個作法似乎是錯誤的, 想問說哪邊出了問題
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define MaxN 100001
bool mask[18]={ 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0};
struct data{ int pos, num, rec; }node[MaxN];
bool compare(data a, data b){ return a.pos<b.pos; }
int main(){
int n, m;
cin>>n>>m;
node[0].num=node[0].pos=node[0].rec=0;
for(int i=1;i<=n;i++)
cin>>node[i].num>>node[i].pos, node[i].rec=node[i].num;
sort(node,node+n+1,compare);
for(int i=n;i>0;i--)
for(int j=i-1;j>=0;j--){
int dis=node[i].pos-node[j].pos;
if( dis>17 ){
node[j].rec=max(node[j].rec,node[i].rec+node[j].num);
break;
}
if( mask[dis] )
node[j].rec=max(node[j].rec,node[i].rec+node[j].num);
}
cout<<node[0].rec<<endl;
}