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;
}