csp21-04-4校门外的树-dp学习版

dp这一类的题目前都没有很好的把握,特意开个专栏来记录做的dp题,希望十天能有一定的进步!!(因为时间比较紧,所以我的文章只是记录自己的做题情况以及遇到疑惑的求助,并没有涉及题解思路什么的)

校门外的树这道题主要涉及到其中方案数的组合,最开始摸不着头脑,后面看了很久满分题解,最终明白了思路,把代码放着记录一下。

//2104-4校门外的树
#include<bits/stdc++.h>
using namespace std;

#define ll long long
const ll mod = 1e9+7;
 
vector<int> yue[100005]; // 记录不同长度的约数因子 
int a[1005]; // 记录树的位置
int f[1005]; // 记录到第i个障碍物的总方案数
bool flag[100005]; // 记录约数使用情况,每次计算不同时需要重置清零

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	for(int i=0; i<n; i++) {
		cin >> a[i];
	}
	// 计算约数----存入表中 
	for(int i=1; i<100005; i++) { // 查找约数为i对应的整数 
		for(int j=2*i; j<100005; j+=i) {
			yue[j].push_back(i);
		}
	} 
	f[0] = 1; // 设置初始值
	for(int i=1; i<n; i++) {
		memset(flag, 0, sizeof(flag)); // 清空状态数组
		for(int j=i-1; j>=0; j--) {
			int d = a[i] - a[j];
			ll cnt = 0; // 方案数
			for(int k=0; k<yue[d].size(); k++) {
				int temp = yue[d][k];
				if(!flag[temp]) {
					cnt++; flag[temp]=true;
				}
			}
			flag[d] = true; // 因为有障碍物,不能选 
			f[i] = (f[i]+f[j]*cnt)%mod; 
		} 
	} 
	cout << f[n-1] << endl;
	return 0;
}
 
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值