1337 Greedy C

本文介绍了一种基于插头动态规划(DP)的算法实现,通过遍历地图寻找最优路径并进行权重累加,最终求解最大得分问题。文中详细展示了从地图数据读取到状态转移的具体过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路错了,没办法解决分支的问题。想了想,应该是个插头dp。 电脑清文件,在这里备份下代码。说不定还以后用得上

#include <bits/stdc++.h>
using namespace std;
int mp[15][15];
int vis[15][15];
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
int sum = 1, m, tem;
set<int> st[70];
vector<int> p(70);
vector<pair<int,int> > E[100];
int book[10];
int ans = -0x3f3f3f3f;
bool ck1 = false;
int  ss,xx,yy ;
void dfs2(int s,int nowans) {
    if(s == ss) ck1 =true;
    if(nowans > ans && ck1 == true) ans = nowans;
    int now = s;
    for(int i = 0; i < (int)E[now].size(); i++) {
        int next = E[now][i].first;
        if(book[next] == 0) {
            book[next] = 1;
           if(next == ss) ck1 =true;
            dfs2(next, nowans + E[now][i].second);
            book[next] = 0;
        }

    }
      if(s == ss) ck1 = false;
}
void dfs(int x,int y) {
    for(int i = 0; i < 4;i++) {
        int tx = x + dx[i];
        int ty = y + dy[i];
        if(tx >= 1 && tx <= m && ty >= 1 && ty <=m)
            if(mp[tx][ty] >=0 && vis[tx][ty] == 0) {
                vis[tx][ty] = sum;
                tem += mp[tx][ty];
                dfs(tx,ty);
        }
    }
}
int main(void) {

    cin >> m >> xx >> yy;
    for(int i = 1; i<= m; i++)
        for(int j = 1; j <= m; j++)
            cin >> mp[i][j];
    for(int i = 1; i <= m; i++)
        for(int j = 1; j  <= m; j++) {
            if(mp[i][j] >= 0 && vis[i][j] == 0) {
                vis[i][j] = sum;
                tem = mp[i][j];
                dfs(i,j);
                p[sum] = tem;
                sum++;
            }
            else if(mp[i][j] < 0 && vis[i][j] == 0) {
                vis[i][j] = sum;
                p[sum] = mp[i][j];
                sum++;
            }
    }
    cout << endl;
    for(int i = 1; i <= m; i++) {
        for(int j = 1; j <= m; j++) {
            cout << vis[i][j] << " ";
        }
        cout <<endl;
    }
    cout << endl;
    for(int x = 1; x <= m; x++) {
        for(int y = 1; y <= m; y++)
            for(int k = 0; k < 4; k++){
               int  tx = x + dx[k];
               int  ty = y + dy[k];
                if(tx >= 1 && tx <= m && ty >= 1 && ty <=m && vis[x][y] != vis[tx][ty] ) {
                        st[vis[x][y]].insert(vis[tx][ty]);
                }

            }
    }
    for(int i = 1; i < sum; i++) {
        for(auto it = st[i].begin(); it != st[i].end(); ++it) {
                 cout << i << " " << *it << " " << p[*it] << endl;
                 E[i].push_back(make_pair(*it, p[*it]));
        }cout << endl;
    }
    ss = vis[xx][yy];
    for(int i = 1 ; i < sum; i++) {
            memset(book,0,sizeof(book));
            book[i] = 1;
            dfs2(i, p[i]);
    }
    cout << ans << endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值