♥
从来的方向考虑。
HDU2084 - 数塔
试着用滚动数组QWQ
♥ 代码
#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
const int N = 105;
int n;
int f[2][N];
int main( )
{
int T;
cin >> T;
while( T-- )
{
memset(f, 0, sizeof(f));
cin >> n;
int t = 1; // 滚动
for(int i = 1; i <= n; i++)
{
t ^= 1;
for(int j = 1; j <= i; j++)
{
scanf("%d",&f[t][j]);
f[t][j] += max(f[t^1][j-1], f[t^1][j]);
}
}
int ans = 0;
for(int i = 1; i <= n; i++) ans = max(ans, f[t][i]);
cout << ans << endl;
}
return 0;
}
♥
HDU1176 - 免费馅饼
♥ 代码
#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int dp[N][15];
int main( )
{
int n, t, x, max_t;
while(scanf("%d",&n)!=EOF && n)
{
memset(dp, 0, sizeof(dp));
max_t = 0;
while( n-- )
{
scanf("%d%d",&x,&t);
dp[t][x]++;
if(max_t < t) max_t = t;
}
for(int i = max_t; i >= 0; i-- )
{
for(int j = 0; j <= 10; j++)
{
if(j != 0) dp[i][j] += max(dp[i+1][j-1], max(dp[i+1][j], dp[i+1][j+1]));
else dp[i][j] += max(dp[i+1][j], dp[i+1][j+1]);
}
}
printf("%d\n",dp[0][5]);
}
return 0;
}
♥
HDU2571 - 命运
♥ 仔细看题啊宝
麻了,我没看见还能 按倍数 走WA一年。
♥
用了倒着走的方法,感觉这样找倍数简单一点(其实并没有,因为在其他地方就复杂了比如初始化)
♥ 代码
#include <iostream>
#include <math.h>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
const int N = 1e3 + 5;
int n, m, t;
int dp[30][N];
int main( )
{
int T;
cin >> T;
while( T-- )
{
scanf("%d%d",&n,&m);
for(int i = 0; i <= m; i++) dp[n+1][i] = -INF;
for(int i = 0; i <= n; i++) dp[i][m+1] = -INF;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
scanf("%d",&dp[i][j]);
}
}
for(int i = n; i > 0; i--)
{
for(int j = m; j > 0; j--)
{
if( i == n && j == m) continue;
int tmp = max(dp[i+1][j], dp[i][j+1]);
for(int k = j*2; k <= m; k += j)
{
tmp = max(tmp, dp[i][k]);
}
dp[i][j] += tmp;
}
}
printf("%d\n",dp[1][1]);
}
return 0;
}