头像

LH




离线:6小时前


新鲜事 原文

LH
1天前
有什么提升智商的好办法吗,我打比赛打得自闭了(。・ˇдˇ・。)


新鲜事 原文

LH
3天前
学习数论的一天开始了


问题 求助orz

LH
6天前

有什么分析初始化dp的技巧吗?分析边界头都疼了

%%%




LH
15天前

$RT$

orz



新鲜事 原文

LH
15天前
看程序写结果有什么方法吗?(除了模拟计算姬的运算)



LH
3个月前

RT orz




LH
3个月前
#include <queue>
#include <stack>
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAXN = 5;
int a[2][MAXN];
bool vis[9][9][9][9][9][9][9][9];

struct node {
    stack<char> rou;
    int tem[2][MAXN];
};

queue<node> s;

void MakeSet();
void bfs();
void inout(node);

int main() {
    for(int i = 1; i <= 4; i++) scanf("%d", &a[0][i]);
    for(int i = 1; i <= 4; i++) scanf("%d", &a[1][5 - i]);
    MakeSet(); 
    bfs();
//  for(int i = 1; i <= 4; i++) printf("%d ", a[1][i]);
//  printf("\n");
//  for(int i = 1; i <= 4; i++) printf("%d ", a[2][i]);
    return 0;
}   

void MakeSet() {
    node z;
    for(int i = 1; i <= 4; i++) z.tem[0][i] = i;
    for(int i = 1; i <= 4; i++) z.tem[1][i] = 9 - i;
    s.push(z);
//  for(int i = 1; i <= 4; i++) printf("%d ", z.tem[1][i]);
//  printf("\n");
//  for(int i = 1; i <= 4; i++) printf("%d ", z.tem[2][i]);
}

void bfs() {
    while(1) {
        node z = s.front();
        bool flag = true;
        for(int i = 1; i <= 4; i++)
            if(z.tem[0][i] != a[0][i] || z.tem[1][i] != a[1][i])
                flag = false;

        if(flag == true) {
            inout(z);
            return;
        }

//      for(int i = 1; i <= 4; i++) printf("%d ", z.tem[0][i]);
//      printf("\n");
//      for(int i = 1; i <= 4; i++) printf("%d ", z.tem[1][i]);
//      printf("\n");
//      char he[MAXN * MAXN];
//      int sum = 0;
//      while(!z.rou.empty()) he[++sum] = z.rou.top(), z.rou.pop();
//      for(int i = sum; i >= 1; i--) printf("%c", he[i]), z.rou.push(he[i]);
//      printf("\n\n");

        s.pop();
        for(int i = 1; i <= 4; i++) swap(z.tem[0][i], z.tem[1][i]);
        if(vis[z.tem[0][1]][z.tem[0][2]][z.tem[0][3]][z.tem[0][4]][z.tem[1][1]][z.tem[1][2]][z.tem[1][3]][z.tem[1][4]] == 0) {
            vis[z.tem[0][1]][z.tem[0][2]][z.tem[0][3]][z.tem[0][4]][z.tem[1][1]][z.tem[1][2]][z.tem[1][3]][z.tem[1][4]] = 1;
            z.rou.push('A');
            s.push(z);
            z.rou.pop();
        }
        for(int i = 1; i <= 4; i++) swap(z.tem[0][i], z.tem[1][i]);//还原 
        //A

        for(int i = 4; i >= 1; i--) z.tem[0][i + 1] = z.tem[0][i], z.tem[1][i + 1] = z.tem[1][i];
        z.tem[0][1] = z.tem[0][5], z.tem[1][1] = z.tem[1][5];
        if(vis[z.tem[0][1]][z.tem[0][2]][z.tem[0][3]][z.tem[0][4]][z.tem[1][1]][z.tem[1][2]][z.tem[1][3]][z.tem[1][4]] == 0) {
            vis[z.tem[0][1]][z.tem[0][2]][z.tem[0][3]][z.tem[0][4]][z.tem[1][1]][z.tem[1][2]][z.tem[1][3]][z.tem[1][4]] = 1;
            z.rou.push('B');
            s.push(z);
            z.rou.pop();
        }
        for(int i = 1; i <= 4; i++) z.tem[0][i] = z.tem[0][i + 1], z.tem[1][i] = z.tem[1][i + 1];//还原 
        //B

        int pro = z.tem[0][2];
        z.tem[0][2] = z.tem[1][2];
        z.tem[1][2] = z.tem[1][3];
        z.tem[1][3] = z.tem[0][3];
        z.tem[0][3] = pro;
        if(vis[z.tem[0][1]][z.tem[0][2]][z.tem[0][3]][z.tem[0][4]][z.tem[1][1]][z.tem[1][2]][z.tem[1][3]][z.tem[1][4]] == 0) {
            vis[z.tem[0][1]][z.tem[0][2]][z.tem[0][3]][z.tem[0][4]][z.tem[1][1]][z.tem[1][2]][z.tem[1][3]][z.tem[1][4]] = 1;
            z.rou.push('C');
            s.push(z);
        }
        //C
    }
}

void inout(node x) {
    int sum = 0;
    stack<char> ans;
    while(!x.rou.empty()) ans.push(x.rou.top()), x.rou.pop(), sum++;
    printf("%d\n", sum);
    while(!ans.empty()) printf("%c", ans.top()), ans.pop();
}


活动打卡代码 AcWing 278. 数字组合

LH
5个月前
#include <cstdio>

const int N = 1e4 + 5;
const int MAXN = 105;
int n, m;
int a[MAXN];
int dp[N][MAXN];//dp[i][j]表示在第j个数前,可以组成i的总方案数

int Max(int x, int y) {return x > y ? x : y;}

int main() {
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 0; i <= n; i++) dp[0][i] = 1;
    for(int i = 1; i <= m; i++) {
        for(int j = 1; j <= n; j++) {
            if(i < a[j]) dp[i][j] = dp[i][j - 1];
            else dp[i][j] = dp[i][j - 1] + dp[i - a[j]][j - 1];
        }
    }
//    for(int i = 1; i <= m; i++) {
//      for(int j = 1; j <= n; j++) {
//          printf("dp[%d][%d] = %d\n", i, j, dp[i][j]);
//      }
//  }
    printf("%d", dp[m][n]);
    return 0;
}



LH
6个月前

rt:让*号能运算高精度(达到python的效果),由于我 太菜 不会,麻烦大佬给我一个模板,orz orz orz