您的位置:首页 > 其它

UVa 10564 DP Paths through the Hourglass

2015-08-13 10:16 253 查看
从下往上DP,d(i, j, k)表示第(i, j)个格子走到底和为k的路径条数。

至于字典序最小,DP的时候记录一下路径就好。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n, sum;
int a[50][25];
long long d[50][50][550];
int p[50][50][550][2];

int main()
{
while(scanf("%d%d", &n, &sum) == 2 && n)
{
memset(d, 0, sizeof(d));
memset(p, 0, sizeof(p));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n - i + 1; j++) scanf("%d", &a[i][j]);
for(int i = n + 1; i < n * 2; i++)
for(int j = 1; j <= i - n + 1; j++) scanf("%d", &a[i][j]);

for(int i = 1; i <= n; i++)
{
int t = a[n*2-1][i];
d[n*2-1][i][t] = 1;
}

for(int i = n*2-2; i >= n; i--)
for(int j = 1; j <= i - n + 1; j++)
for(int k = a[i][j]; k <= sum; k++)
{
int t = k - a[i][j];
if(d[i+1][j][t]) { d[i][j][k] += d[i+1][j][t]; p[i][j][k][0] = 1; }
if(d[i+1][j+1][t]) { d[i][j][k] += d[i+1][j+1][t]; p[i][j][k][1] = 1; }
}

for(int i = n - 1; i >= 1; i--)
for(int j = 1; j <= n - i + 1; j++)
for(int k = a[i][j]; k <= sum; k++)
{
int t = k - a[i][j];
if(d[i+1][j-1][t]) { d[i][j][k] += d[i+1][j-1][t]; p[i][j][k][0] = 1; }
if(d[i+1][j][t]) { d[i][j][k] += d[i+1][j][t]; p[i][j][k][1] = 1; }
}

long long ans = 0;
for(int i = 1; i <= n; i++) ans += d[1][i][sum];
printf("%lld\n", ans);
if(!ans) { puts(""); continue; }

int j, now = sum;
for(int i = 1; i <= n; i++) if(d[1][i][sum]) { j = i; break; }
printf("%d ", j - 1);

for(int i = 1; i < n * 2 - 1; i++)
{
if(p[i][j][now][0])
{
printf("L");
now -= a[i][j];
if(i < n) j--;
}
else
{
printf("R");
now -= a[i][j];
if(i >= n) j++;
}
}
puts("");
}

return 0;
}


代码君

还有一件事想抽自己两巴掌,就是一直困惑我的谜之AC,谜之WA,是因为没关freopen,WTF!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: