程式設計思維與實踐 Week10 作業

2021-10-05 09:12:09 字數 1801 閱讀 7391

給定兩個數n

nn和m

mm,輸出n

nn經過若干次乘2或乘3後轉換為m

mm的次數

首先判斷m是否能被n整除,如果能夠整除,將m除以n,之後進行迴圈,每次對m除以2或者除以3,直到m=1為止,若某次迴圈m沒有除以2或3,即次數沒有改變,說明無法轉換。

#include

using

namespace std;

intmain()

else

if(m %3==

0)if(t == ans)}if

(m ==

1) cout << ans << endl;

}return0;

}

給定兩個序列a和b。

求序列a的lis和序列ab的lcs的長度。

這道題可以分為兩個部分,求取最長上公升子串行和求取最長公共子串行。

lis:

lcs:

#include

#include

using

namespace std;

int a[

5010

], b[

5010];

int f[

5010];

int f1[

5010][

5010];

intmain()

f[i]

= maxx +1;

}int maxx =0;

for(

int i =

1; i <= n;

++i)

if(f[i]

> maxx) maxx = f[i]

; cout << maxx <<

' ';

f1[1]

[0]= f1[0]

[1]= f1[0]

[0]=

0;for(

int i =

1; i <= n;

++i)

} cout << f1[n]

[m];

return0;

}

給 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。

我們使用 cnt

[i

]cnt[i]

cnt[i]

表示數 i

ii 的個數

#include

#include

using

namespace std;

long

long dp[

100010];

long

long cnt[

100010];

intmain()

dp[1]

= cnt[1]

; dp[2]

=max

(cnt[2]

*2, dp[1]

);for(

int i =

3; i <= maxx;

++i)

dp[i]

=max

(dp[i-1]

, dp[i-2]

+ cnt[i]

* i)

; cout << dp[maxx]

<< endl;

return0;

}

程式設計思維與實踐 Week10 作業

b lis lcs c 拿數問題 ii 東東在玩遊戲 game23 在一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出 1。輸入的唯一一行包括兩個整數n和m 1 n m 5 10 8 輸出從n轉...

SDU程式設計思維與實踐作業Week10

1本題直接暴力就可以了 include 321.lis 最長上公升子串行 嚴格遞增 我們只需要記錄0 i的最長上公升子串行就可以了 計算i 1時 若 存在j include using namespace std const int maxn 1e4 long long a maxn b maxn ...

SDU程式設計思維Week10 作業 A 簽到題

一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸入的唯一一行包括兩個整數n和m 1 n m 5 10 8 輸出將n轉換成m的操作次數,如果轉換不了輸出 1。input 1 12051840 output 1 7input 2 4242 ...