为什么这种做法是错误的?
查看原帖
为什么这种做法是错误的?
813622
Igallta楼主2024/11/12 16:00

思路:用记忆化,p[i][j] 代表第 i 个格子,在上一个格子走 j 步到这个格子。

两个样例都能过,却只拿了十分??

自造数据也都能过啊。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=355;
int ans,p[N][5],a[N],l[5],n,m;
void wyd(int u,int sum,int tp){
	if(p[u][tp] > sum)return;
	p[u][tp]=sum;
	if(u==n)return;
	for(int i=1;i<=4;i++){
		if(l[i] && u+i<=n){
			--l[i];
			wyd(u+i,sum+a[u+i],i);
			++l[i];
		}
	}
}
signed main(){
	/*freopen("tortoise.in","r",stdin);
	freopen("tortoise.out","w",stdout);*/
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		int u;
		cin>>u;
		++l[u];
	}
	wyd(1,a[1],0);
	cout<<max({p[n][1],p[n][2],p[n][3],p[n][4]});
	return 0;
}
2024/11/12 16:00
加载中...