//Code by __dest__ruct__or__(uid=592238)
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
#define umap unordered_map
#define uset unordered_set
#define ll long long
#define ld long double
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define spe putchar(' ')
#define edl putchar('\n')
#define ret return
const ll INF=9223372036854775807;
namespace mySTL{
inline int max(int a,int b){ret a>b?a:b;}
inline int min(int a,int b){ret a<b?a:b;}
inline ll max(ll a,ll b){ret a>b?a:b;}
inline ll min(ll a,ll b){ret a<b?a:b;}
inline ld min(ld a,ld b){ret a<b?a:b;}
inline ld max(ld a,ld b){ret a>b?a:b;}
inline double min(double a,double b){ret a<b?a:b;}
inline double max(double a,double b){ret a>b?a:b;}
inline int _abs(int a){ret a<0?-a:a;}
inline ll _abs(ll a){ret a<0?-a:a;}
inline int read(){char c=getchar();int f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans=(ans*10+c-'0'),c=getchar();
ret ans*f;}
inline ll readll(){char c=getchar();ll f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans=(ans*10+c-'0'),c=getchar();
ret ans*f;}
inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
inline void swap(ll &a,ll &b){a^=b,b^=a,a^=b;}
inline void write(int x){if(x<0){putchar('-');x=-x;}
if(x>=10){write(x/10);}putchar(x%10+'0');}
inline void write(ll x){if(x<0){putchar('-');x=-x;}
if(x>=10){write(x/10);}putchar(x%10+'0');}
inline ll pw(ll a,ll b,ll p){if(b==0)ret 1;
if(b==1)ret a%p;
ll mid=pw(a,b/2,p)%p;
if(b&1)ret mid*mid%p*a%p;else{ret mid*mid%p;}}
inline int gcd(int a,int b){ret b?gcd(b,a%b):a;}
inline ll gcd(ll a,ll b){ret b?gcd(b,a%b):a;}
inline int lcm(int a,int b){ret a/gcd(a,b)*b;}
inline ll lcm(ll a,ll b){ret a/gcd(a,b)*b;}
inline void write(string s){int len=s.length();
for(int i=0;i<len;i++) putchar(s[i]);}
}
using namespace mySTL;
const int mod=10;
int n,m,a[160],dp1[160][160][12],q[160],dp2[160][160][12],ans1,ans2;
inline int dfs1(int l,int r,int step){
if(dp1[l][r][step]!=0x3f3f3f3f){
return dp1[l][r][step];
}
if(step+1==m){
return dp1[l][r][step]=((q[r]-q[l]+mod)%mod+mod)%mod;
}
dp1[l][r][step]=1000;
for(int i=l;i<r;i++){
dp1[l][r][step]=min(dp1[l][r][step],dfs1(i+1,r,step+1)*(((q[i]-q[l-1])%mod+mod)%mod));
}
return dp1[l][r][step];
}
inline int dfs2(int l,int r,int step){
if(dp2[l][r][step]!=-1){
return dp2[l][r][step];
}
if(step+1==m){
return dp2[l][r][step]=((q[r]-q[l]+mod)%mod+mod)%mod;
}
dp2[l][r][step]=1;
for(int i=l;i<r;i++){
dp2[l][r][step]=max(dp2[l][r][step],dfs2(i+1,r,step+1)*(((q[i]-q[l-1])%mod+mod)%mod));
}
return dp2[l][r][step];
}
int main(void){
memset(dp1,0x3f,sizeof(dp1));
memset(dp2,-1,sizeof(dp2));
n=read();
m=read();
for(int i=1;i<=n;i++){
a[i]=read();
a[i]=(a[i]%mod+mod)%mod;
q[i]=(q[i-1]+a[i])%mod;
}
for(int i=n+1;i<=n*2;i++){
a[i]=a[i-n];
q[i]=(q[i-1]+a[i])%mod;
}
ans1=2147483647;
ans2=-1;
for(int i=1;i<=n;i++){
ans1=min(ans1,dfs1(i,n+i-1,0));
}
write(ans1);
edl;
for(int i=1;i<=n;i++){
ans2=max(ans2,dfs2(i,n+i-1,0));
}
write(ans2);
ret 0;
}
明天再看吧,先睡了。
我这个做法跟区间 dp 差不多。