我要开始做USACO的DP以对抗智力下降
P6205 [USACO06JAN] Dollar Dayz S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题解:完全背包,__int128,傻逼题
#include<bits/stdc++.h>
using namespace std;
__int128 f[10001];
void write(__int128 x)
{
if(x>9) write(x/10);
putchar(x%10+'0');
}
int main()
{
int n,k;
cin>>n>>k;
f[0]=1;
for(int i=1;i<=k;i++)
{
for(int j=i;j<=n;j++)
{
f[j]+=f[j-i];
}
}
write(f[n]);
return 0;
}
P6208 [USACO06OCT] Cow Pie Treasures G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题解:f[ i ][ j ] 可以被f[ i ][ j-1 ],f[ i-1 ][ j-1 ],f[ i+1 ][ j-1 ] 这个题目比较关键的地方我认为是,列数每次都会+1,这样就带来的可以从小列数到大列数递推的可能(所以应该先枚举j,j<=c)。that's a easy problem.
#include<bits/stdc++.h>
using namespace std;
int a[101][101];
int f[110][110];
int main()
{
memset(f,-0x3f,sizeof f);
int r,c;
cin>>r>>c;
for(int i =1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>a[i][j];
}
}
f[1][1]=a[1][1];
for(int j=2;j<=c;j++)
{
for(int i=1;i<=r;i++)
{
f[i][j]=max(f[i][j-1],max(f[i+1][j-1],f[i-1][j-1]))+a[i][j];
}
}
cout<<f[r][c]<<endl;
return 0;
}