每日一題(11) poj1276

2021-07-25 00:02:08 字數 1602 閱讀 2561

1. 本來覺得很簡單,卻耗費了一天半的時間。本來做完1837之後感覺已經明白了怎麼做。但是事實彷彿並非如此。當然,這也有自己的一點執念。

2. 這幾天體會到,寫程式就像做數學題一樣,很忌諱一算就錯。程式也是,不能想起來覺得這樣這樣,但是寫起來沒有把握對。就像前兩天有個演講說的那樣,印度的程式很厲害,因為所有人寫的都一樣。程式是工業產品,流水線上的產品,是有標準答案的。

3. 總覺得不要怕。自己在這次中遇到了很嚴重的問題,不知道怎麼錯的。是自己的思路。要是以往,也許就是看看網上別人的思路,照著別人的思路寫。這樣,即使寫不對還可以有答案看。但是這次自己逼著自己去一點一點思考,到底**有問題。程式就是這樣,肯定是思路的不嚴謹。要勇敢,敢於啃硬骨頭。一定要想明白。這對於上面的自信很重要。一定要將來,自己寫的**有把握不出錯。

4. 說這道題,其實就是多重揹包問題。揹包九講裡面說的很好。就不多說了。只是我寫了好幾個版本,包括原始的,暴力,二進位制優化的。

5.自己的版本一直過不了。因為超時。原來是因為有問題,自己思路錯了。

6. 這道題是多個測試案例。不要忘了。否則就是wa。但是題目裡面沒有

下面是各個版本的**:

7. 首先是自己的思路,很基本的三層迴圈:

#include#include#includeusing namespace std;

int n;

int c;

int num[20];

int cash[20];

int dp[11][100005];

int main()

if(n==0||c==0)

}cout <

#include#include#includeusing namespace std;

int n;

int c;

int num[20];

int cash[20];

int dp[100005];

int main()

//cout<<"test: "<>c>>n;

if(c==0)

if(temp>dp[j])

dp[j] = temp;

//cout<<"test:"<

#include#include#includeusing namespace std;

int n;

int c;

int num[20];

int cash[20];

int dp[100005];

int main()

//cout<<"test: "<>c>>n;

if(c==0)}}

}cout <

#include#include#includeusing namespace std;

int dp[100005];

int cash[150];

//int num[20];

int c,n;

int count;

int main()

cash[count++] = cashtemp * k;

k = k*2;}}

}for(int i = 1; i = 0; j--)

}cout<

12. 如果要記錄路徑的話,應該就可最大序列差不多了。

每日一題(14) poj1260

1.一次ac 248k 0ms 2.其實就是公式。如前面所說。只要有公式就好辦。一看感覺可以用動態規劃。dp i max 關鍵是後面的動態那部分怎麼寫,也就是c j 1,i 是怎麼算。這裡就是吧從j 1.i全部當成i層。可以想到,如果你覺得j 1.i之間還可以細分層,這麼想是對的。但是已經算過。因為...

每日一題(15) poj2533

1.直接用之前的lis 了。而且那段 求了序列出來。刪掉一部分。但是交了兩次都wa。後來發現,忘了注釋掉重定向了。2.沒啥可說,主要是公式,而且很簡單,就是dp i max.另外,不一定最後的最大。所以最後乙個迴圈找到最大的。include include includeusing namespac...

每日一題(18) poj1159

1.自己思考思路的時候開始覺得用動態規劃,但是想不出公式。後來覺得如果把輸入的字串反過來,然後和原來的字串相比求最大序列,然後答案就是原來的序列減去最大序列了。因為無法匹配的肯定需要新增。可以匹配的話就一定會出現在最大序列裡面。這可以用反證法證明。解決了方法的問題。下面就是 其實就是乙個最大序列匹配...