摘要:
题意:在一个方格图里只能向右和向下走,且每次走的步数只能是方格内的数,求从左上角到右下角最多的路线数。Analyse:用二维数组a[][]存储图,用dp[i][j]存储走到a[i][j]最多的路线数,dp[i][j]=sigma{dp[x][y](若a[x][y]能走到a[i][j])}。但要实现每个dp[i][j]的计算都不重不漏,需要一个适当的计算顺序。由于只能向右和向下走,所以计算dp[i][j]实际只需先有a[i][j]上面全列的最多路线和左面全排的最多路线,所以可以从dp[0][0]一层一层向外计算,每一层先算上面和左面。View Code 1 #include<iostrea 阅读全文
摘要:
题意:有各种作业,分别给出用时,最后期限,每超一天就扣一分。问做完所有作业的最少扣分及其策略。Analyse:自己看的时候是一头雾水,看别人的题解上写的是状态压缩的DP。状态压缩:用0和1表示某一作业的状态,1代表已完成,0代表未动手,一个int足以表示所有的不同状态,例如5中的5表示为二进制就是101,代表第一个作业和第三个作业已经完成,第二个作业未完成,dp[5]就表示假设只有三个作业,只完成第一和第三个作业扣的最少分数。View Code 1 #include<string> 2 #include<iostream> 3 #include<vector> 阅读全文
摘要:
题意:求递增子序列的和的最大值。Analyse:一开始想到的居然是把每个格子的加或不加都计算一次然后放在数组里面,再想一下发觉这就是暴力了。之后还是想到了动态规划的方法,因为a[n]能不能加进去只跟之前的子序列最后一个元素的大小有关,所以如果a[n]能加进去某个子序列里面的话,只需要用到这个子序列的最优解(而不需要其他情况的),而且要使a[n]为尾的子序列的和最大,要选一个之前的最大的子序列。因此递推式为dp[n]=max{dp[i],i=0,1,2......n-1}+a[n]或dp[n]=a[n]。View Code 1 #include<iostream> 2 using n 阅读全文
摘要:
题意:对给出的序列求最少的非升序列数目。Analyse:一开始以为用最长降序子序列来做,后来发现可以这样做:后面的数字如果比前面的所有子序列的最后一个都大,就必须要增加一个子序列(增加一个系统),否则可以添加到之前的子序列后面。View Code 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int a[100000]; 5 int main() 6 { 7 vector<int> dp; 8 vector<int>::size_type st; 9 int n, 阅读全文
摘要:
题意:n个平面最多可以将一个球体分成多少部分。Analyse:据大神记载,要把3维降成2维,递推公式F(n)=F(n-1)+f(n-1),F(n)为n个平面最多可以将一个球体分成的数目,f(n)为n条直线最多可以把一个平面分成的数目。View Code 1 #include<iostream>2 using namespace std;3 int main()4 {5 int n;6 while(cin>>n)7 cout<<((n-1)*n*(2*n-1)+3*n*(n-1))/12+n+1<<endl;8 return 0;9 } 阅读全文
摘要:
题意:给出一个不多于64个盘子的汉诺塔的摆法,都已经符合小盘在上大盘在下的规则,需要做的是判断是否为正确摆法。Analyse:第一眼看下去就觉得是用递归做的,可就是理不顺思路,停停滞滞放了很久,今天终于狠心要搞定它。定义一个递归函数hanoi(n,a1,a2,a3),表示将n个盘子从a1柱移到a3柱。一、若n在a1,则n-1只能在a1或a2。分两种情况:1、n-1在a1,即要做的是将n-2个盘从a1移到a3,返回hanoi(n-2,a1,a2,a3);2、n-1在a2,即要做的是将n-2个盘从a3移到a2,返回hanoi(n-2,a3,a1,a2);不是这两种情况就返回0.二、若n在a3,则n 阅读全文
摘要:
题意:小于四位的斐波那契数fib(n)直接输出,大于四位的斐波那契数只输出最左边四位,n<100000000。Analyse:跟1060相同原理。10^x=fib(n)(用通项公式),求出x。令y=3.·#¥%……—*(小数部分是x的小数部分),再输出10^yView Code 1 #include<stdio.h> 2 #include<math.h> 3 #define C ((sqrt(5)+1)/2) 4 int fib(int n) 5 { 6 return (int)( (pow( (sqrt(5)+1)/2 , n ) - pow( (1 阅读全文
摘要:
Square CoinsTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4528Accepted Submission(s): 3068Problem DescriptionPeople in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of al 阅读全文
摘要:
排列2Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2076Accepted Submission(s): 816Problem DescriptionRay又对数字的列产生了兴趣:现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。Input每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。Output对每组卡片按从小到大的顺序输出所有能由这四张卡片组成 阅读全文
摘要:
题意:求给定的humble number有多少个因数?(humble number:质因子只有2,3,5,7的整数)Analyse:用数组pd[4](prime divisor)记录质因数2,3,5,7的次数。n的因数都可表示为n=2^pd[0]*3^pd[1]*5^pd[5]*7^pd[3],只要有一个指数不与对应底数的指数相等,两个质因数就是不相等的。因此,题目的意思就是求2,3,5,7的指数的组合。(注意指数可以为0)因此因数个数为(pd[0]+1)*(pd[1]+1)*(pd[2]+1)*(pd[3]+1)。View Code 1 #include<stdio.h> 2 m 阅读全文