最近一直在看动态规划,看到这道题时候直接想到了动态规划,这道题和矩阵连乘可以一起做,看到有些人是用贪心做的,我一开始没想到。下面是代码,原理我都写清楚了。
#include<iostream>
#include<memory.h>
using namespace std;
/*
HDU: 今年暑假不AC
题目说明:
Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数
据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处
理。
Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
分析:
设f(s,e)为开始时间为s到e能观看的最大节目数。
对于f(0,2)=Max{f(0,1)+f(1,2),f(0,2)},对于f(0,i)=Max{f(0,1)+f(1,i),f(0,2)+f(2,i),…,f(0,i-1)+f(i-1,i)}
*/
int main(){
int n=0;
int Ti[101][101];
int Ti_s,Ti_e;
int i,j,k,l,max,temp,max_num=0;
while(true){
cin>>n;
memset(Ti,0,10000*sizeof(int));//清零
if(n<=0) break;
else{//输入处理
for(i=0;i<n;i++){
cin>>Ti_s>>Ti_e;
Ti[Ti_s][Ti_e]=1;
if(max_num<Ti_e) max_num=Ti_e;
}
for(i=1;i<=max_num;i++){//循环次数
for(j=0,k=i;k<=max_num;j++,k++){//j代表行,k代表列,计算该位置的值
max=Ti[j][k];
for(l=j+1;l<k;l++){//计算所有组合的最大值
temp=Ti[j][l]+Ti[l][k];
if(temp>max) max=temp;
}
if(max>Ti[j][k]) Ti[j][k]=max;//更新次数
}
}
cout<<Ti[0][max_num]<<endl;
}
}
return 0;
}