标签:
input | output |
---|---|
4 1 5 0 6 5 3 5 |
14 3 |
大致题意:
有n个城市被列车道串起来(即位于一排),可以在相邻的两个城市间的车道上装一个装置,然后经过此车道的列车上的乘客就会变得开心。
输入一个邻接矩阵表示一天中列车的起始终点站,输出k个位置可以安放装置的位置,使开心的人数最大化
思路:显然的DP,记录路径即可,然后就是需要维护前缀和和后缀和之类的快速求出两城市间的乘客流量
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <string> #include <vector> #include <cstdio> #include <ctime> #include <bitset> #include <algorithm> #define SZ(x) ((int)(x).size()) #define ALL(v) (v).begin(), (v).end() #define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i) #define reveach(i, v) for (__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++ i) #define REP(i,n) for ( int i=1; i<=int(n); i++ ) using namespace std; typedef long long ll; #define X first #define Y second typedef pair<ll,ll> pii; template <class T> inline bool RD(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? -1 : 1; ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template <class T> inline void PT(T x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) pt(x / 10); putchar(x % 10 + '0'); } const int N = 550; int mp[N][N]; int dp[N][N]; int sum[N][N]; int f[N][N]; int n,k; int pre[N][N]; int res[N],top; void ini(){ memset(mp,0,sizeof(mp)); memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum)); memset(f,0,sizeof(f)); memset(pre,-1,sizeof(pre)); top = 0; } int main(){ while(~scanf("%d%d",&n,&k)){ ini(); REP(i,n){ for(int j = i+1; j <= n; j++) { RD(mp[i][j]); sum[i][j] = sum[i-1][j]+mp[i][j]; } } REP(x,n) for(int y = x+1; y <= n;y++) { f[x][y] = f[x][y-1]+mp[x][y]; } REP(c,k) for(int i = c+1; i <= n;i++){ int tmp = 0; for(int j = i-1; j >= c;j--){ tmp = tmp-f[j+1][i]+sum[j][j+1]; if( dp[j][c-1]+tmp >= dp[i][c]){ dp[i][c] = dp[j][c-1]+tmp; pre[i][c] = j; } } } printf("%d\n",dp[n][k]); for(int ans = pre[n][k--]; ~ans ; ans = pre[ans][k--]){ res[++top] = ans; } sort(res+1,res+1+top); REP(i,top) printf("%d%c",res[i],i == top? '\n':' '); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
URAL 1900. Brainwashing Device(dp+输出路径)
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/47259521