
本题思路:本题是一道经典的dp问题,设第i个数的首位数字是first, 末位数字是last。因为第i个数只可能加到一个以first结尾的接龙数列中使得这个接龙数列长度加1并且结尾数字变成last.所以状态转移方程为dp[i][last] = max(dp[i - 1][last], dp[i - 1][first] + 1)而显然第一维可以优化掉。
- #include
-
- constexpr int N=1e5+10;
-
- int n;
- int dp[N][10];//表示前i个数以j结尾最小删除的个数
-
- /*
- 设第i个数的首位数字是first, 末位数字是last。
- 因为第i个数只可能加到一个以first结尾的接龙数列中
- 使得这个接龙数列长度加1并且结尾数字变成last.
- 所以状态转移方程为dp[i][last] = max(dp[i - 1][last], dp[i - 1][first] + 1)
- 而显然第一维可以优化掉。
- */
-
- int main()
- {
- std::ios::sync_with_stdio(false);
- std::cin.tie(nullptr);std::cout.tie(nullptr);
-
- std::cin>>n;
- for(int i=1;i<=n;i++){
- std::string num;
- std::cin>>num;
-
- int first=num[0]-'0',last=num[num.size()-1]-'0';
- for(int j=0;j<10;j++){
- if(j==last)
- dp[i][j]=std::min(dp[i-1][first],dp[i-1][last]+1);
- else
- dp[i][j]=dp[i-1][j]+1;
- }
- }
-
- int res=INT_MAX;
- for(int i=0;i<10;i++) res=std::min(res,dp[n][i]);
-
- std::cout<
- return 0;
- }
二、冶炼金属OJ链接
本题思路:本题是一道数学的题目,设答案为v,因为能炼出b个但炼不出b+1个,所以有b×v≤a且a<(b+1)×v即 ab+1
- #include
-
- int main()
- {
- std::ios::sync_with_stdio(false);
- std::cin.tie(nullptr);std::cout.tie(nullptr);
-
- int n;
- int mi = 0 , mx = 2e9 ;
-
- std::cin>>n;
- for(int i = 1 ; i <= n ; i ++){
- int a , b ;
- std::cin >> a >> b ;
- int r = a/b , l = a/(b+1)+1;
- mi = std::max(mi , l);
- mx = std::min(mx , r) ;
- }
-
- std::cout << mi << ' ' << mx << std::endl ;
- return 0;
- }