C++题集「含分类」「算法与数据结构」(持续更新ing

C++题集


目录

C++题集

DP问题

Dice Sum

King Bombee

Choose Elements

搜索问题

Shortest Good Path(BFS)

思维题

Bracket Sequence Deletion

Max Min

Math

K-colinear Line

Polynomial division

贪心问题

Wrapping Chocolate

二分问题

Range Count Query

木材加工

跳石头


DP问题

Dice Sum

题目传送门:Atcoder Beginner Contest 248 C Dice Sum (opens new window)
反思:做的时候想到了可能会是DP,但是并没有深入的去想该怎么表示状态,状态转移方程是什么。
思路:
状态表示:dp[i][j]表示前i个数,和为j。
状态转移方程:dp[i][j] = dp[i][j] + (dp[i-1][0]+dp[i][1]+....)

AC代码

#define int long long
using namespace std;
const int mod = 998244353;
const int N = 60,M=2510;
int dp[N][M];
signed main()
{
  int t=1;
  while(t--){
    int n,m,k;cin>>n>>m>>k;
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
      for(int j=1;j<=k;j++){
        for(int u=1;u<=m;u++){
          if(j-u>=0){
            dp[i][j] = (dp[i][j] + dp[i-1][j-u]) % mod;
          }
        }
      }
    }
    int ans = 0;
    for(int i=1;i<=k;i++) ans = ( ans + dp[n][i] ) % mod;
    cout<

King Bombee

题目传送门:Atcoder Beginner Contest 244 E King Bombee (opens new window)
反思:赛时做的时候就以为纯纯图论,但是自己还是不太熟悉,导致完全没有想到是DP。
题解:
先来思考几个问题:
1.为什么是DP?
ans:取模,奇偶,求方案数
2.怎么表示状态?
ans:用dp[i][j][k],三维数组来表示,dp[i][j][k]表示走到值为i,第j个位置时的数量,k则用0/1表示X出现了奇数次还是偶数次。
3.X出现奇数次和偶数次的状态如何表示?

//如果说这个值和X相等
dp[i][j+1][1/0] += dp[i][j][0/1];
//如果不等呢?
dp[i][j+1][1

你可能感兴趣的:(每日一题,算法与数据结构,C++,C,刷题!)