zoukankan      html  css  js  c++  java
  • 九度OJ 1552座位问题(dp)

    刚开始写的一维数组,但是由于后面的数字较大,要对它取模,所以用一维数组进行减法运算,结果就不对了。所以还是得用二维数组,用dp[n][0]来表示第n位为男生总的方法个数,dp[n][1]表示第n位为女生总方法个数。那么男生的状态转移方程为dp[n][0] = dp[n - 1][0] + dp[n - 1][1]; 意思就是只要最后一位放男生的话,不管前面是什么都可以放的,都满足题目给的那个条件,女生的状态转移方程为dp[n][1] = dp[n - 1][1] + dp[n - 2][0]; 意思是当第n位放女生的时候,那么第n-1位一定是女生才满足条件,所以要加上n-1位的女生个数,但是有一种情况dp[n-1][1]里面没有包含,就是 “....男女”这种情况,因为这种情况在dp[n-1][1]的时候是不满足要求的,那么再加上这个少的,所以要加n-2的男生。初始化数据的时候小心点就行了。关键是仔细读题!

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 const int N = 1005;
     7 const long long mod = 1000000007;
     8 long long dp[N][2];//dp[i][0]表示第i个位置排男生的总方法数
     9 int main()
    10 {
    11     int n;
    12     memset(dp, 0, sizeof(dp));
    13     dp[1][0] = 1;//男生 
    14     dp[1][1] = 0;//女生
    15     dp[2][0] = 1;
    16     dp[2][1] = 1;
    17     dp[3][0] = 2;
    18     dp[3][1] = 2;
    19     for (int i = 4; i < N; i++)
    20     {
    21         dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
    22         dp[i][0] %= mod;
    23         dp[i][1] = dp[i - 1][1] + dp[i - 2][0];
    24         dp[i][1] %= mod;
    25     }
    26     while (~scanf("%d", &n))
    27     {
    28         
    29         printf("%lld
    ", (dp[n][0] + dp[n][1]) % mod);
    30     }    
    31     return 0;
    32 }
  • 相关阅读:
    Quartz 多个触发器
    Java获取一个路径下指定后缀名的所有文件
    Dom4J对XML的创建、修改、删除等操作
    struts2的json-default和struts-default的区别
    在JSP页面中输出JSON格式数据
    jbpm4.4 demo3
    jbpm4.4 demo2
    jbpm4.4 demo1
    十六进制字符串操作
    如何使用C#操作WinAPI
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/4337396.html
Copyright © 2011-2022 走看看