poj 动态规划DP - 1953 World Cup Noise

这一题其实就是斐波那契数列,但是我一开始用的是DP,不过应该思想差不多。

一数组dp[i][2],dp[i][0]代表前i个数里面最后一个数字为0的数量,dp[i][1]代表前i个数里面最后一个数字为1的数量,可知dp[i][1]+dp[i][0]就是前i个数能组成序列的数量。

这里因为不能2个1在一起,所以:

dp[i][0] = dp[i-1][0]+dp[i-1][1]

dp[i][1] = dp[i-1][0]

#include<stdio.h>
#include<string.h>
#define MAX 47
int dp[MAX][2];
int n;
int DP(){
	int i;
	memset(dp,0,sizeof(dp));
	dp[1][0]=1;dp[1][1]=1;
	for(i=2;i<=n;i++){
		dp[i][0] = dp[i-1][0]+dp[i-1][1];
		dp[i][1] = dp[i-1][0];
	}
	return dp[n][0]+dp[n][1];
}
int main(){
	int t,c=1;
	scanf("%d",&t);
	while(c<=t){
		scanf("%d",&n);
		printf("Scenario #%d:\n",c++);
		printf("%d\n",DP());
		printf("\n");
	}
}
时间: 2024-11-10 08:43:30

poj 动态规划DP - 1953 World Cup Noise的相关文章

poj - 1953 - World Cup Noise(dp)

题意:n位长的01序列(0 < n < 45),但不能出现连续的两个1,问序列有多少种. 题目链接:http://poj.org/problem?id=1953 -->>设dp[i][j]表示前 i 位中第 i 位为 j 时的序列数,则状态转移方程为: dp[i][0] = dp[i - 1][0] + dp[i - 1][1]; dp[i][1] = dp[i - 1][0]; 因为对于相同的n,其结果是固定的,所以可以对一个n只计算一次,然后记住她.. #include <

poj 1953 world cup noise

题目大意:给出一个数n,求n位二进制中有多少个数不包含相邻的1. 思路:推出前3项后就可以发现满足斐波那契数列.先用数组记录下1~n位的结果,再通过输入的值访问相应下标的元素的值即可. #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int bit[50]; void calc() { int i; bit[1]=2; bit[2]=3;//将特殊的两个值记录 fo

poj 动态规划DP - 2392 Space Elevator

背包九讲里面的多重背包问题.每一块积木有高度和数量,也有最大能到的高度位置限制.我们DP前首先要对高度限制进行排序,因为从直观角度说,我们也需要先处理较小的能到高度的积木,这样才能取到最大值.例如第一个高度是11,限制高度是100,第二个的限制高度是10,那如果直接处理,第二个不会被处理到. #include<stdio.h> #include<stdlib.h> #include<string.h> #define max(x,y)(x>y?x:y) struc

poj 动态规划DP - 2018 Best Cow Fences

这道题目我一开始的思路是用二维DP,结果TLE了.后来换了个思路,终于AC了. 不需要判断所有的情况,我们用dp[i]表示前i个牛圈中最大的牛数,而这个i首先必须>=限制的牛圈树f.用num[i]表示dp[i]中包含了多少牛圈. 我们可以知道,dp[i] = sum[i] - sum[i-f])/f  or  dp[i-1] + data[i], 前一个代表到i为止前f个牛圈的牛数,后一个代表前i-1个牛圈中最大牛数+第i个牛圈中的牛数.其实也就是到i为止前num[i-1]+1个牛圈的牛数.而判

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

poj 1458 动态规划DP

//  poj 1458  zoj 1733  最长公共子序列  DP #include <iostream>#include <string.h>#define N 1005using namespace std ;char  s1[N],s2[N];   int dp[N][N];int max(int a,int b)   {    return a>b ? a : b ;  }void f(int n,int m){   int i,j;    for (i=0; i

{POJ}{动态规划}

动态规划与贪心相关: {POJ}{2479}{Maximum Sum} (DP) 摘要: 题意:给定n个数,求两段连续子列的最大和.思路:先从左向右dp,求出一段连续子列的最大和,再从右向左dp,求出两段连续子列的最大和,方法还是挺经典的. {POJ}{1036}{Gansters} (DP) 摘要: 题意:有个伸缩门,门的宽度0~K,每个时间可以伸长或缩短1个单位,有N个流氓,他们在T时刻到达,如果这时门的宽度正好与他们的stoutness相等时,便可获得一定的收入,问最大的收入是多少. 思路

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

动态规划(DP),类似LIS,FatMouse&#39;s Speed

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weight相同的按照speed从大到小排列; 2.Count[i]表示到第i个老鼠时,所求的最长“速度递减”子序列的长度: 3.path[i]=j是题目的关键,记录在Count[i]=Count[j]时,即最长“速度递减”子序列最后一个老鼠的前一只老鼠的位置 4.递归输出id void output(in