[蓝桥杯]算法提高 天天向上(记忆化搜索)

问题描述
  A同学的学习成绩十分不稳定,于是老师对他说:“只要你连续4天成绩有进步,那我就奖励给你一朵小红花。”可是这对于A同学太困难了。于是,老师对他放宽了要求:“只要你有4天成绩是递增的,我就奖励你一朵小红花。”即只要对于第i、j、k、l四天,满足i<j<k<l并且对于成绩wi<wj<wk<wl,那么就可以得到一朵小红花的奖励。现让你求出,A同学可以得到多少朵小红花。
输入格式
  第一行一个整数n,表示总共有n天。第二行n个数,表示每天的成绩wi。
输出格式
  一个数,表示总共可以得到多少朵小红花。
样例输入
6
1 3 2 3 4 5
样例输出
6
数据规模和约定
  对于40%的数据,n<=50;
  对于100%的数据,n<=2000,0<=wi<=109
思路:dp[i][j]代表着到了第i位已经安排了j个数的方案数,初始化为-1。
如果当前这种状态遍历过,那么就可以直接返回,这样节省时间。
代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=2e3+100;
int a[maxx];
ll dp[maxx][5];
int n;

inline ll dfs(int num,int pos)
{
	if(num==4) return 1;
	if(dp[pos][num]!=-1) return dp[pos][num];
	ll cnt=0;
	for(int i=pos+1;i<=n;i++) if(a[i]>a[pos]) cnt+=dfs(num+1,i);
	return dp[pos][num]=cnt;
}
int main()
{
	scanf("%d",&n);
	memset(dp,-1,sizeof(dp));
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	ll ans=0;
	for(int i=1;i<=n-3;i++) ans+=(ll)dfs(1,i);
	printf("%lld\n",ans);
	return 0;
}

努力加油a啊,(o)/~

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读