#15018: 關於解法


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [49.216.18.187]
最後登入時間 :
2024-11-10 10:25:04
b276. 4和7 -- CH #48 | From: [140.113.136.218] | 發表日期 : 2018-08-31 23:56

雖然題目有標示是 DP, 但是 m的範圍這麼大, 應該不可能是紀錄0~m之間所有的狀態

感覺題目的4和7是有意義但不知道怎麼做?

 
#15020: Re:關於解法


icube (!@#$%^&*()_+)

學校 : 不指定學校
編號 : 61090
來源 : [220.135.116.184]
最後登入時間 :
2024-08-24 18:11:03
b276. 4和7 -- CH #48 | From: [220.135.116.184] | 發表日期 : 2018-09-01 14:25

雖然題目有標示是 DP, 但是 m的範圍這麼大, 應該不可能是紀錄0~m之間所有的狀態

感覺題目的4和7是有意義但不知道怎麼做?

只有停留在 n 個格子上時才有意義,而不用關注中間的走法。

注意到 4x + 7y = k 在 k 為 >=18 的正整數時 x, y 一定有非負整數解,

也就是說格子 A、B 的座標 (x_A < x_B) 差 18 以上時必能從 A 跳到 B,

而 < 18 的情形不多可以直接枚舉。

 
#15022: Re:關於解法


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [49.216.18.187]
最後登入時間 :
2024-11-10 10:25:04
b276. 4和7 -- CH #48 | From: [140.113.208.164] | 發表日期 : 2018-09-02 00:39

雖然題目有標示是 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;

}

 
ZeroJudge Forum