codeforces Round574 C、D1

it2022-05-05  154

C题:

简单dp

我们令dp[ i ][ j ]表示在选择第 i 列第 j ( j 为0 或 1 代表两行)行元素的情况下当前的最大高度,那么他一定是从dp[ i -1 ][ ! j ]或

dp[ i - 2 ][ ! j ]得到的;试想,对于9  3  5  7  3元素7,我们如果选择7的话,那么它一定是从元素1或是8的位置得到的,以为相邻

                                                  5  8  1  4  5

元素的同一行是不能同时选的,而如果我们跳过前面一列,那么我们只能从元素8来选择7,因为如果选择跟元素8同一列的话,我们一定会选下一列的1,于是得到状态转移方程:

dp[ i ][ j ] = a[ i ] + max(dp[ i-1 ][ ! j ],dp[ i - 2][ ! j ])

代码:

#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn = 1e5 + 10; ll a[maxn][2],dp[maxn][2]; int main() { ll n; scanf("%lld",&n); for (int i = 0;i < 2;i ++) for (int j = 0;j < n;j ++) scanf("%lld",&a[j][i]); dp[0][0] = a[0][0]; dp[0][1] = a[0][1]; dp[1][0] = max(a[0][1] + a[1][0],a[0][0]); dp[1][1] = max(a[1][1] + a[0][0] ,a[1][0]); for (int i = 2;i < n;i ++) for (int j = 0;j < 2;j ++) dp[i][j] = a[i][j] + max(dp[i-1][!j],dp[i-2][!j]); printf("%lld\n",max(dp[n-1][0],dp[n-1][1])); return 0; }

D1:

对于每一位的数字,我们计算出它的贡献再加起来就行了

代码:

#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 998244353 ll n; ll qpow(ll a,ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % mod; b >>= 1; a = a * a % mod; } return res; } ll solve(string s) { ll l = s.size(),res = 0; for (int i = 0;i < l;i ++) { res = (res+n*(s[i]-'0')*qpow(10,2*(l-i)-1)%mod)%mod; res = (res+n*(s[i]-'0')*qpow(10,2*(l-i)-2)%mod)%mod; } return res; } int main() { std ::ios :: sync_with_stdio(false); cin>>n; string s; ll ans = 0; for (int i = 0;i < n;i ++) { cin>>s; ans = (ans + solve(s)) % mod; } cout<<ans<<"\n"; return 0; }

 


最新回复(0)