P2014 [CTSC1997] 选课
P2014 [CTSC1997] 选课
一,题目
[CTSC1997] 选课
题目描述
在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有
输入格式
第一行有两个整数
接下来的
输出格式
只有一行,选
样例 #1
样例输入 #1
7 4
2 2
0 1
0 4
2 1
7 1
7 6
2 2
样例输出 #1
13
二,解析
六要素
1,状态
5,边界值
边界值要注意的就是 f要初始化
6,目标值
直接输出
三,代码
#include<bits/stdc++.h>
using namespace std;
int n,m,mbxjz[305][305],head[305]/*点*/,num;
struct edge{
int to,pre;
}edge[305];//线
void add(int from,int to){
++num;
edge[num].pre=head[from];
edge[num].to=to;
head[from]=num;
}
void mbwhq(int x){//套板子
for(int i=head[x];i;i=edge[i].pre){
int ngm=edge[i].to;
mbwhq(ngm);//向更深层dp
for(int j=m+1;j>=1;j--){
for(int k=0;k<j;k++){
mbxjz[x][j]=max(mbxjz[x][j],mbxjz[ngm][k]+mbxjz[x][j-k]);//动态转移方程
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int fa;
cin>>fa>>mbxjz[i][1];
add(fa,i);//连接fa,i
}
mbwhq(0);//相当于dp函数
cout<<mbxjz[0][m+1];
return 0;
}