研一算法分析课程record

http://47.99.179.148/problemlist.php

1001
注意两个问题,使用string 和getline 函数

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	int n;
	cin>>n;
	string a[n+1];
	int sum[n+1];
	memset(sum,0,sizeof(sum));
	getchar();///warning must be use the getchar() function to clear the enter keyboard and then use the getline() function
	for(int i=0;i<n;i++)
	{
	//	cin>>a[i];   the cin cant get space from the keybroad must use the getline() function
	    getline(cin,a[i]);
		for(int j=0;j<a[i].length();j++)
		{
			int t=a[i][j]-'0';
			if(t<=9 && t>=0)
			{
			sum[i]++;
		    }
		}
	}
	for(int i=0;i<n;i++)
	{
		cout<<sum[i]<<endl;
	}
		
	return 0;
}

1009
//最长递减序列问题LDS

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int m;
	cin>>m;	
	int n;
	int num[100]; //record the number of height 
	int result[100];//output 
	int dp[100];
	int t=0;
	
	for(int ii=0;ii<m;ii++)
	{
		cin>>n;
		for(int jj=0;jj<n;jj++ )
		{
			cin>>num[jj];
		}
/*	错解 不是从第一个开始,只要选择最长的序列即可 
//		int log[100];
//		int flag=num[0];
//		memset(log,0,sizeof(log));
//		
//		log[0]=1;//第一位默认为基准,序列长度为1
//		//所以记录当前位值从第一位开始的最长序列,当前的值与之前的所有值相比较
//		//d当前的值小于前面某一位长度的值时,在其长度上加一,所以一定能得到最长的那个值
//		//需要注意,当当前某值比num[0]大时,则没必要比较 
//		
//		for(int k=1;k<n;k++)
//		{
//			if(num[k]>=flag)  //因为是以第一位为基准,所以当大于第一位的数据,则直接除去,不用比较,否则后面的数据会受影响 
//			{
//				log[k]=-1;
//				continue;
//			 } 
//			for(int L=0;L<k;L++)
//			{
//				if(log[L] == -1)
//				{
//					continue;
//				}
//				
//				if(num[k]<num[L])
//				{
//					log[k]=log[L]+1; //单纯的在前面的数据的标记上加一,无法区分最长的 ex:8 9 7 6 7 5 6 4,当在5的时候,无法单纯的在前面的7的标记为2上加一,明显8 7 6 5更长,
//					                 // 但是可以考虑选择最长的序列加一,这就是LDS中的第二个判断条件的缘由 
//				}
//			}
//			
//		}
*/
		//直接使用LDS,longest descreasing sequence,寻找最长子序列
		//考虑到1008题,要求输出所有的最长子序列,直接寻找所有的最长子序列 
		//输出所有的个数,则为1008题题解
		
		int ans=-1;
		for(int i=0;i<n;i++)
		{
			dp[i]=1;
			for(int j=0;j<i;j++)
			{
				if(num[i]<num[j] && (dp[j]+1 > dp[i]))
				{
					dp[i]=dp[j]+1;
				}
			}
			ans=max(ans,dp[i]);
			
		}	
		  result[t++]=ans;		
	}
	for(int i=0;i<m;i++)
	{
		cout<<result[i]<<endl;
	}
 } 

1014

//最大子序列和问题,利用DP  
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int num[50000];//将大数组定义为全局变量,放置在静态存储中可以防止溢出,同时可以自动赋值为0
int dp[50000];
int result[10000];

bool cmp(int a,int b)
{
	return a>b;
}

int main()
{
	
	int m;
	cin>>m;
	int n;
    int k=0;
	
	for(int ii=0;ii<m;ii++)
	{
		cin>>n;
		for(int jj=0;jj<n;jj++)
		{
			cin>>num[jj];
		}
		dp[0]=num[0];
		
		for(int i=1;i<n;i++)
		{
			dp[i]=max(dp[i-1]+num[i],num[i]);//dp存储的是以当前位置结尾的最大值,两种选择 1:其本身最大 2 :其本身加上前一数据最大值, 比较这两者即可得出当前位置下的最大 
		}                 //从0开始,一层层的递推过去 
		
		sort(dp,dp+n,cmp);
		
		result[k++]=dp[0];
		
		memset(dp,0,sizeof(dp));
		memset(num,0,sizeof(num));
	}
	
	
	for(int i=0;i<m;i++)
	{
		cout<<result[i]<<endl;
	}
	
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值