其他分享
首页 > 其他分享> > 牛客 Bang! Bang!

牛客 Bang! Bang!

作者:互联网

题目链接:https://ac.nowcoder.com/acm/contest/9716/B

思路: 根据数据范围和题意 很容易看出是dp

主要是 边界的处理是 无效状态的去除   dp[i][j][0/1] 代表 前i个字符有j个重音节 且当前是/否 重音节

对于当前音符 可以是重音符也可以不是  不是的时候 dp[i][j][0]=dp[i-1][j][1]+dp[i-1][j][0]

是的时候  一般状态下是  dp[i][j][1]=dp[i-k-1][j-1][1]+dp[i-k-1][j-1][0]  即隔了k个的位置

特判 j==1的时候 就可以不受限制在任意位置放 dp[i][1][1]=1

为了 方便 初始化i=1 然后让i=2开始dp

 1 class Solution {
 2 public:
 3 
 4     #define ll long long 
 5     ll dp[1010][1010][2];
 6     const int mod=1e9+7;
 7     long long solve_bangbang(int n, int m, int k) {
 8         // write code here
 9         dp[1][1][1]=dp[1][0][0]=1;
10         for(int i=1;i<=n;i++)
11         {
12             dp[i][0][0]=1;
13         }
14         for(int i=2;i<=n;i++)
15         {
16             for(int j=1;j<=i;j++)
17             {
18                 dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
19                 dp[i][j][0]%=mod;
20                 
21                 if(j==1)
22                 {
23                     dp[i][j][1]=1;
24                 }
25                 else
26                 {
27                     if(i-k-1>=1)
28                         dp[i][j][1]=dp[i-k-1][j-1][0]+dp[i-k-1][j-1][1];
29                 }
30                 dp[i][j][1]%=mod;
31             }
32         }
33         ll ans=dp[n][m][0]+dp[n][m][1];
34         ans%=mod;
35         return ans;
36     }
37 };
View Code

 

贴一份错误代码  主要是i-k-1<1 的判断时 不一定方案数一定有1

 1 class Solution {
 2 public:
 3 
 4     #define ll long long 
 5     ll dp[1010][1010][2];
 6     const int mod=1e9+7;
 7     long long solve_bangbang(int n, int m, int k) {
 8         // write code here
 9         dp[1][1][1]=dp[1][0][0]=1;
10         for(int i=1;i<=n;i++)
11         {
12             dp[i][0][0]=1;
13         }
14         for(int i=2;i<=n;i++)
15         {
16             for(int j=1;j<=i;j++)
17             {
18                 dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
19                 dp[i][j][0]%=mod;
20                 if(i-k>=1)
21                     dp[i][j][1]=dp[i-k][j-1][0];
22                 else  // 错了 因为把无效状态变成了1
23                     dp[i][j][1]=1;
24                 dp[i][j][1]%=mod;
25             }
26         }
27         ll ans=dp[n][m][0]+dp[n][m][1];
28         ans%=mod;
29         return ans;
30     }
31 };
View Code

 

标签:int,ll,long,牛客,Bang,1010,dp,mod
来源: https://www.cnblogs.com/winfor/p/14089199.html