HDU ACMSteps 1.3.2:: 今年暑假不AC(动态规划)

最近一直在看动态规划,看到这道题时候直接想到了动态规划,这道题和矩阵连乘可以一起做,看到有些人是用贪心做的,我一开始没想到。下面是代码,原理我都写清楚了。

#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;

点赞