DFS 全 WA 求调
查看原帖
DFS 全 WA 求调
592238
Elairin176楼主2023/4/2 21:51
//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 差不多。

2023/4/2 21:51
加载中...