東東在玩遊戲「game23」。
在一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出-1。
input
輸入的唯一一行包括兩個整數n和m(1<=n<=m<=5*10^8).
output
輸出從n轉換到m的操作次數,否則輸出-1.
example簽到題思路比較簡單,用m除以n,看是否為整數,如果是整數再繼續判斷是否可以被3整除或被2整除,記錄相除的次數,如果出到最後為1則可以轉換,否則不可以。
#include
using
namespace std;
intmain()
else
if(mod%2==
0)else
} cout << ans;
}return0;
}
東東有兩個序列a和b。
他想要知道序列a的lis和序列ab的lcs的長度。
注意,lis為嚴格遞增的,即a1第一行兩個數n,m(1<=n<=5,000,1<=m<=5,000)
第二行n個數,表示序列a
第三行m個數,表示序列b
輸出一行資料ans1和ans2,分別代表序列a的lis和序列ab的lcs的長度
examplelis問題的狀態轉移方程為:
lis的長度為max,其中fi 表示以 ai 為結尾的最長上公升序列的方程。
lcs問題的狀態轉移方程為:
if i0||j0,f[i][j]=0
else if ai == bj ,f[i][j] = f[i-1][j-1] + 1
else f[i][j] = max(f[i-1][j], f[i][j-1])
然後f[m][n]的值即為lcs 的長度
#include
using
namespace std;
int dp[
5010][
5010];
//.......
intmain()
cout << ans <<
" ";
for(
int i =
0; i <= n; i++)}
cout << dp[n]
[m]<< endl;
return0;
}
yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。
給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。
第一行包含乙個整數 n (1 ≤ n ≤ 105),表示數字裡的元素的個數
第二行包含n個整數a1, a2, …, an (1 ≤ ai ≤ 105)
輸出乙個整數:n你能得到最大分值。
example狀態轉移方程為:
dp[i] = max(dp[i - 1], dp[i - 2] + i * sum[i])
dp陣列記錄每乙個數出現的次數,dp[i]記錄取小於等於i的數時的最大分數。
#include
using
namespace std;
long
long dp[
100010
],a[
100010];
intmain()
dp[0]
=0, dp[1]
= a[1]
;for
(long
long i=
2;i<=mx;i++
) cout << dp[mx]
;return0;
}
山東大學程式設計第二週作業
東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。輸出若干行,表示從左上...
山東大學程式設計第八周作業
給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 input 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai b...
山東大學程式設計思維作業15
zjm 為了準備霍格沃茲的期末考試,決心背魔咒詞典,一舉拿下咒語翻譯題 題庫格式 魔咒 對應功能 背完題庫後,zjm 開始刷題,現共有 n 道題,每道題給出乙個字串,可能是 魔咒 也可能是對應功能 zjm 需要識別這個題目給出的是 魔咒 還是對應功能,並寫出轉換的結果,如果在魔咒詞典裡找不到,輸出 ...